一个刚刚返回对象文字的构造函数是如何工作的?
当我将它们调用为以下时,以下两个构造函数的功能都相同(据我所知):
var x2z = new xyz('ralph');
是否我写这样的构造函数:
function xyz(name) {
return {
name: name,
x:1,
get y() {return this.x+1},
get z() {return this.y+1}
}
}
或者如果我宣布它:
function xyz(name) {
this.name = name;
this.x = 1;
Object.defineProperties(this, {
"y": {"get": function() {return this.x+1}}
}),
Object.defineProperties(this, {
"z": {"get": function() {return this.y+1}}
})
}
第二种形式是无处不在的文件。 但为什么第一个工作? 新的关键字是否被忽略并且对象文字被返回?
这两者如何相互关联? 如果有人能指出我的参考很棒, 我可以在对象上找到很多东西,但是在第一种形式中我没有找到任何东西。
我把一个简单的jsperf放在一起,文字版本稍微快一些,但如果它只是一个奇怪的话,还不够用。 (以jsperf为例)。 但它似乎比更通常使用的指向“this”的构造函数更直接。
MDN有关于“新”的非常好的文档:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/new
由构造函数返回的对象成为整个新表达式的结果。 如果构造函数没有显式地返回一个对象,则使用[开始]创建的对象。 (通常,构造函数不会返回值,但如果他们想覆盖正常的对象创建过程,他们可以选择这样做。)
为什么第一个工作?
请注意,第一个不会创建从xyz.prototype
继承的实例。
新的关键字是否被忽略并且对象文字被返回?
是。 如果构造函数return
秒的对象,将由返回new
运营商,而不是说,构建并传递到构造函数实例this
。 有关详细信息,请参阅JavaScript中的“新”关键字是什么? 或MDN。
但是,请注意,如果使用第一个,则应该省略new
(以明确它是工厂函数),如果使用第二个,则应该将构造函数转换为Xyz
。
上一篇: How does a constructor that just returns an object literal work?