使用dot和原型添加方法

时间:2016-03-07 13:31:22

标签: javascript

我有以下代码:

(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"时,我不明白为什么代码有效。但不是#34; SayHello.prototype.load"。并将功能分配给" SayHello.prototype.print"可以工作,但是#Say; SayHello.print"不能。

1 个答案:

答案 0 :(得分:1)

  

我不明白为什么代码在分配函数时有效   “SayHello.load”但不是“SayHello.prototype.load”。

SayHello.loadSayHello.prototype.load不同,因为在第一个中你将属性添加到SayHello对象中,而在第二个中你将它添加到SayHello的原型中。

所以当你这样做时

var obj1 = new SayHello();

在第一种情况下(SayHello.load)obj1将不具有load属性,但在第二种情况下(SayHello.prototype.load)它将具有。

现在这意味着当你执行SayHello.load时,你基本上处理了一个变量,它的初始化被提升到函数的顶部。换句话说,变量SayHello已经初始化,但构造函数SayHello尚未定义。

这就是为什么你不能在

之前做SayHello.prototype.load
function SayHello() 
{
    this.text = "text";  
}

但你可以SayHello.load,因为它不涉及SayHello的构造函数。