对于在 Javascript 中创建对象的构造函数和文字表示法之间的差异和相似之处,似乎有很多不同的答案。我最近读到“当通过对象文字符号定义对象时,实际上从未调用过 Object 构造函数。 ”(该语句在创建数组时也适用)。我知道在使用构造函数表示法时,“new”关键字是设置初始化对象的“this”关键字的原因。那么在使用文字符号创建对象时是否没有设置“this”关键字,这就是上面的句子在说“对象构造函数从未被实际调用”时的意思吗?
问问题
477 次
1 回答
3
创建对象文字后,该this
值将立即在对象内部可用(但它始终取决于 context)。最好用一个例子来解释:
var obj = {
foo : true,
// bar : this.foo, // THIS WOULD FAIL, this IS NOT AVAILABLE YET!
baz : function() {
return this; // THIS IS OK, this WILL BE AVAILABLE
// WHEN THE FUNCTION IS *CALLED*
}
};
obj === obj.baz(); // true
关于你引用的那句话:
通过对象字面量表示法定义对象时,从不实际调用 Object 构造函数
那不准确。在幕后,Object
构造函数被调用(或者至少它表现得好像是这样)。我相信这句话所指的是这之间的区别:
var obj = { foo : true };
还有这个:
function Foo() {
this.foo = true;
}
var obj = new Foo();
两个版本都会产生非常相似(但不相同)的对象。以下是一些差异:
构造函数版本允许您在创建对象的同时运行其他代码(如调用函数)(只需从构造函数调用某些函数)。
在文字版本中,
obj instanceof Object === true
. 在构造函数版本中,obj instanceof Object
两者obj instanceof Foo
都是true
.
还有其他差异,但也许这两个是最显着的。另外,我想澄清一些你似乎误解的事情:
我知道在使用构造函数表示法时,“new”关键字是设置初始化对象的“this”关键字的原因。
这不是真的。尽管您可以this
从构造函数内部引用,但 的值this
是动态确定的(例如,当您调用方法时)。我建议您阅读MDN 文档页面this
以更好地理解这一点。
于 2013-02-01T19:39:33.830 回答