只返回对象文本的构造函数如何工作

How does a constructor that just returns an object literal work?

本文关键字:何工作 工作 构造函数 返回 对象 文本      更新时间:2023-09-26

当我调用它们时,以下两个构造函数的工作方式相同(据我所知):

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