我具有以下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/