一个刚刚返回对象文字的构造函数是如何工作的?

当我将它们调用为以下时,以下两个构造函数的功能都相同(据我所知):

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

链接地址: http://www.djcxy.com/p/64167.html

上一篇: How does a constructor that just returns an object literal work?

下一篇: Javascript prototype vs $.extend