我有以下代码
(function() {
var sayHello;
sayHello = (function() {
//add method to SayHello?
SayHello.load = function() {
var s = new SayHello();
return s;
};
//SayHello constructor
function SayHello() {
this.text = "hello";
}
//add method to SayHello
SayHello.prototype.print = function(selector){
var elm = document.querySelector(selector);
elm.innerHTML = this.text;
};
return SayHello;
})();
window.s = sayHello;
})();
我不明白为什么代码在将函数分配给“SayHello.load”而不是“SayHello.prototype.load”时有效。将函数分配给“SayHello.prototype.print”可以,但不能分配给“SayHello.print”。
最佳答案
I don't understand why the code works when assigning function to "SayHello.load" but not to "SayHello.prototype.load".
SayHello.load
与 SayHello.prototype.load
不同,因为在第一个中您将属性添加到 SayHello 对象,而在第二个中您是将其添加到 SayHello 的原型(prototype)中。
所以当你这样做的时候
var obj1 = new SayHello();
在第一种情况下 (SayHello.load
) obj1 将没有加载属性,但在第二种情况下 (SayHello.prototype.load
) 它将有。
现在这意味着当您执行 SayHello.load 时,您基本上是在处理一个变量,该变量的初始化被提升到函数的顶部。换句话说,变量 SayHello
已经初始化,但构造函数 SayHello
尚未定义。
这就是为什么您不能在 SayHello.prototype.load
之前执行
function SayHello()
{
this.text = "text";
}
但您可以执行 SayHello.load
,因为它不涉及 SayHello
的构造函数。
关于javascript - 添加带点和原型(prototype)的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35845105/