3

对于在 Javascript 中创建对象的构造函数和文字表示法之间的差异和相似之处,似乎有很多不同的答案。我最近读到“当通过对象文字符号定义对象时,实际上从未调用过 Object 构造函数。 ”(该语句在创建数组时也适用)。我知道在使用构造函数表示法时,“new”关键字是设置初始化对象的“this”关键字的原因。那么在使用文字符号创建对象时是否没有设置“this”关键字,这就是上面的句子在说“对象构造函数从未被实际调用”时的意思吗?

4

1 回答 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 回答