javascript - 添加带点和原型(prototype)的方法

标签 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”而不是“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.loadSayHello.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/

相关文章:

javascript - 适当的内联 try catch

javascript - 如何在没有 node.js 的情况下使用 JavaScript 导入/导出?

javascript - 使用extendscript在illustrator中缩放对象

javascript - React State 监听对象属性变化

javascript - JavaScript 函数方法

javascript - 闭包和模块有什么区别?

javascript - jquery 用 img 替换 span 并检查加载的 img

javascript - 如何将javascript渲染模块集成到scrapy中?

javascript - Angular2错误: Return type of public method from exported class has or is using private name

javascript - 如何在 filter 方法的回调函数中使用 for 循环?