只返回对象文本的构造函数如何工作
How does a constructor that just returns an object literal work?
当我调用它们时,以下两个构造函数的工作方式相同(据我所知):
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 示例)。但它似乎比引用"this"的更常用的构造函数更简单。
MDN有关于"new"的非常好的文档:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/new
构造函数返回的对象将成为整个新表达式的结果。如果构造函数未显式返回对象,则改用 [最初] 创建的对象。(通常构造函数不返回值,但如果它们想要重写正常的对象创建过程,则可以选择这样做。
为什么第一个有效?
请注意,第一个不会创建从 xyz.prototype
继承的实例。
是否只是忽略了 new 关键字并返回了对象文本?
是的。如果构造函数return
一个对象,则该对象将由 new
运算符返回,而不是构造并作为 this
传递给构造函数的实例。有关详细信息,请参阅 JavaScript 中的"new"关键字是什么?或 MDN。
但是,请注意,如果使用第一个,则应省略new
(以明确它是工厂函数),如果使用第二个,则应将构造函数大写为Xyz
。
相关文章:
- Javascript:selenium Web驱动程序isDisplayed()不工作
- jQuery UI自动完成突然停止工作
- AngularJS UI路由器不能像ng路由器那样工作
- HTML5音频加载和播放获胜'我不能在iPad上工作
- JavaScript打印功能使日历停止工作
- Javascript.getHours()工作不正常
- 为什么这在IE中的工作方式与在Firefox中不同
- 视频HTML没有'无法在Internet Explorer 11上工作
- 扩展移相器按钮类不工作
- Firebase迁移-简单的Firebase.set没有'不再工作了——旧的还是新的
- 谷歌地图不是以HTML显示,而是在JS Fiddle上工作
- 正在尝试使用if和else添加类,但无法正常工作
- Jquery FadeIn FadeOut 只工作一次
- Foreach无法在Typescript中工作
- 另一个ajax调用中的Jquery ajax调用在for循环中没有按预期工作
- 为什么不是't窗口.恢复正常工作吗?(javascript/jquery)
- JS可以在Chrome中工作,但不能在Firefox中工作
- ajaxToolkit PopupControlExtender不工作.过时的
- HTML标记在脚本标记中工作
- 在JavaScript中的类中,push和concat的工作方式有何不同