JS Power Constructor和instanceof没有新的

时间:2015-06-06 22:31:19

标签: javascript constructor prototype new-operator

引用this guy我们可以使用形式为

的幂构造函数
function constructor() {
    var that = {};
    that.data = true;
    that.method = function () {};
    return that;
}

创建具有或不具有new关键字的行为正确的对象。

我的问题是我们如何连接运营商以与电源构造商合作?我认为它与object.prototype.constructor属性有关,但我不确定如何在构造函数的范围内编辑它。

constructor() instanceof constructor // false but I want it to be true
new constructor() instanceof constructor // true

3 个答案:

答案 0 :(得分:3)

如果你试图在JS中购买思想学校,你不应该使用new,那么你选择了很多语言功能,包括instanceof

instanceof与JavaScript function-as-constructor + prototypal inheritance范例密切相关。 x instanceof C专门查看C.prototype,并将其与x的原型链进行比较(请参阅OrdinaryHasInstance算法)。 C.prototype查找旨在与new运算符一起使用,当应用于任何函数F时,它将在其原型链中创建一个F.prototype的新对象,构造函数F将运行(this设置为新分配的对象)。

“Power constructors”只是返回对象的函数,不适用于普通的语言机制(包括ES2015类)。尝试使用instanceof是相互矛盾的:如果你想发誓new,你也应该发誓instanceof

使instanceof工作的任何技巧都会像Matt Browne的回答一样,最终会重新创建new已经提供的整个基础架构。 (见a similar conversation I've had previously。)

答案 1 :(得分:1)

您可以使用此构造

function constructor() {
    if (!(this instanceof constructor))
        return new constructor();
    this.data = true;
    this.method = function () { };
}

您可以在Node.js本机模块中找到此结构

示例:

function Hash(algorithm, options) {
    if (!(this instanceof Hash))
        return new Hash(algorithm, options);
    this._handle = new binding.Hash(algorithm);
    LazyTransform.call(this, options);
}

答案 2 :(得分:0)

正如我在评论中所说,我个人更喜欢使用严格模式来确保程序员不会忘记使用new关键字。但是,这是另一种方法,而不使用new关键字:

function demo() {
    var that = Object.create(demo.prototype);
    that.data = true;
    that.method = function () {};
    return that;
}

var d = demo();
d instanceof demo // true

这是一种替代方法,也避免使用new

var demo = {
    init: function() {
        this.data = true;
    },
    method: function() {}
}
var d = Object.create(demo);
d.init();

demo.isPrototypeOf(d) // true