对于在Javascript中创建对象的构造函数和文字符号之间的差异和相似性,似乎有很多不同的答案。我最近读到“在通过对象文字符号定义对象时,实际上从不调用Object构造函数。”(在创建数组时,此语句也成立)。我知道“new”关键字是在使用构造函数表示法时设置初始化Object的“this”关键字。那么在使用文字符号创建对象时没有设置“this”关键字,并且上面的句子是什么意思是“对象构造函数从未被实际调用过”?
答案 0 :(得分:3)
创建对象文字后,会立即在对象内部使用this
值(但始终为depends on the 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”关键字是在使用构造函数表示法时设置初始化Object的“this”关键字。
那不是真的。尽管您可以从构造函数中引用this
,但this
的值是动态确定的(例如,当您调用方法时)。我建议你阅读MDN documentation page on this
以便更好地理解。