引用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
答案 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