Javascript对象构造函数从未使用文字表示法调用?

时间:2013-02-01 19:32:19

标签: javascript constructor literals

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

1 个答案:

答案 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 Objectobj instanceof Foo都是true

还有其他差异,但也许这两个是最值得注意的。另外,我想澄清你似乎误解的事情:

  

我知道“new”关键字是在使用构造函数表示法时设置初始化Object的“this”关键字。

那不是真的。尽管您可以从构造函数中引用this,但this的值是动态确定的(例如,当您调用方法时)。我建议你阅读MDN documentation page on this以便更好地理解。