javascript - 没有 new 的 JS Power Constructor 和 instanceof

标签 javascript constructor prototype new-operator

引用this guy我们可以使用具有以下形式的幂构造函数

function constructor() {
    var that = {};
    that.data = true;
    that.method = function () {};
    return that;
}

创建在有或没有 new 关键字的情况下都能正确运行的对象。

我的问题是我们如何连接 instanceof 运算符以使用幂构造函数?我认为它与 object.prototype.constructor 属性有关,但我不确定如何在构造函数的范围内编辑它。

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

最佳答案

如果您试图接受 JS 中的思想流派,即您不应使用 new,那么您将选择退出许多语言功能,包括 instanceof.

instanceof 与 JavaScript 函数作为构造函数 + 原型(prototype)继承范式齐头并进。 x instanceof C 专门查看C.prototype,并将其与 x 的原型(prototype)链进行比较(参见 OrdinaryHasInstance 算法)。 C.prototype 查找旨在与 new 运算符一起使用,当将其应用于任何函数 F 时,将创建一个新对象F.prototype 在其原型(prototype)链中,构造函数 F 将在其上运行(this 设置为新分配的对象)。

“强大的构造函数”只是返回对象的函数,不适用于普通语言机制(包括 ES2015 类)。尝试与它们一起使用 instanceof 是自相矛盾的:如果你想放弃 new,你也应该放弃 instanceof

您为使 instanceof 工作而采取的任何技巧,如 Matt Browne 的回答中的技巧,最终都将实质上重新创建 new 已经提供的整个基础设施。 (参见 a similar conversation I've had previously。)

关于javascript - 没有 new 的 JS Power Constructor 和 instanceof,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30688224/

相关文章:

javascript - 所有 INCLUDE 的组合 WHERE 子句

javascript - Angular 中的动画 orderBy 列表值

javascript - 空函数 "function(){}"在JS对象构造函数中如何工作?

javascript - 使用 Object.create 进行继承?

javascript - Angular 应用程序 $http 请求本地主机上的 Node 应用程序

java 。隐式 super 构造函数 Employee() 未定义。必须显式调用另一个构造函数

C#新操作bug?

c++ - 带有初始化列表的空构造函数是否被认为是微不足道的?

javascript - 为什么改变对象的 [[prototype]] 会降低性能?

javascript - 重置内容可编辑的插入符号位置