我具有以下JavaScript函数:

function Console() {
    this.Log = function(msg) {
        if (document.getElementById("console")) {
            var console = document.getElementById("console");
            console.innerHTML += msg + "<br/>";
        }
    }
}

问题1:
为什么需要使用新的关键字?
new Console().Log("hello world");

我为什么不能这样做呢?
Console().Log("hello world without using new");

问题2:
var logger = function() {
    this.log = function(msg) {
        new Console().Log(msg);
        new Console().Log("log initialized");
    }

    this.log2 = function(msg) {
        new Console().Log(msg);
        new Console().Log("log2 initialized");
    }
}(); //notice the brackets

由于logger末尾的(),因此无法运行。
new logger().log("hello world");

我知道尾随()表示函数立即被调用,但为什么不起作用?是因为function(){}();不能分配给其他变量?

最佳答案

  • new关键字创建Console对象的实例,然后可以在其上调用Log方法。如果仅直接调用Console(),则将获得该函数的返回值。在您的情况下,没有,所以undefined。另外,如果不使用new关键字,则在该“类函数”中分配给this的任何内容都会污染全局范围。因此,不必将方法分配给this,而必须使用将返回的代理对象。
  • 在您的示例中,您将logger变量分配给调用匿名函数的返回值。同样,它不返回任何内容,因此调用new logger()无效,因为您无法实例化undefined。因此,从匿名函数中删除结尾的()会将函数分配给logger而不是其返回值,然后可以使用new实例化该函数。 (您也可以再次使用代理对象)。

  • 在以上两个示例中,我强烈建议您使用new关键字,而不是创建和返回代理对象。这利用了Javascript的内置实例化机制和函数原型(prototype)链,并且比对象创建快得多。

    约翰·雷西格(John Resig)的这篇博客文章值得一读,以获取有关Java中“类”实例化如何工作的更多信息:http://ejohn.org/blog/simple-class-instantiation/

    10-02 18:12
    查看更多