当我调用它们时,以下两个构造函数的工作方式相同(据我所知):
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}}
})
}
第二种形式是随处可见的形式。但为什么第一个有效呢?是否忽略了new关键字并返回了对象文字?
两者如何相互关联?如果有人能指出我的参考资料会很棒;我可以在对象上找到很多东西但是我没有在第一个表单上找到任何东西。
我把一个简单的jsperf放在一起,文字版本稍快一些,但如果它只是一个奇怪的话,还不足以使用它。 (jsperf example)。但它似乎比引用“this”的更常用的构造函数更直接。
答案 0 :(得分:2)
MDN有关于" new":https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/new
的非常好的文档构造函数返回的对象成为整个新表达式的结果。如果构造函数没有显式返回对象,则使用[最初]创建的对象。 (通常构造函数不会返回值,但如果他们想要覆盖正常的对象创建过程,他们可以选择这样做。)
答案 1 :(得分:1)
为什么第一个有效?
请注意,第一个不会创建从xyz.prototype
继承的实例。
是否忽略了new关键字并返回了对象文字?
是。如果构造函数return
是一个对象,那么new
运算符将返回该对象,而不是构造的实例,并将其作为this
传递给构造函数。有关详细信息,请参阅What is the 'new' keyword in JavaScript?或MDN。
但是,请注意,如果您使用第一个,则应省略new
(以明确它是工厂函数),如果使用第二个,则应将构造函数大写为{{1 }}