【问题标题】:Using Object.setPrototypeOf with instanceof将 Object.setPrototypeOf 与 instanceof 一起使用
【发布时间】:2018-09-04 01:35:49
【问题描述】:

我正在尝试使用Object.setPrototypeOf 重新设置已转换为 JSON 并返回对象的对象的原型。但是,instanceof 似乎并没有像我预期的那样工作:

class Foo
{

}

Object.setPrototypeOf({ }, Foo) instanceof Foo; // Returns false

为什么会这样?据我所知,instanceof 的工作原理是将给定对象的原型与引用的类进行比较。有没有其他方法可以做到这一点?

【问题讨论】:

  • @MattBrowne 请提交答案;我会接受的。

标签: javascript typescript object ecmascript-6 prototype


【解决方案1】:

JS 类只是构造函数和原型的语法糖。 Foo 是构造函数,而不是原型......所以你需要使用Foo.prototype 而不是Foo

Object.setPrototypeOf({ }, Foo.prototype)

但是,由于warning on MDN

更改对象的 [[Prototype]] 的本质是 现代 JavaScript 引擎优化属性访问,速度非常慢 操作

改为使用Object.create():

const obj = Object.create(Foo.prototype)

然后您可以使用Object.assign() 复制数据(假设data 是您解析的JSON 数据):

Object.assign(obj, data)

或者,如果你的类有一个构造函数,允许你从一个参数设置它的初始状态,你可以只使用new Foo(data),但是上面的方法更通用,因为它绕过了构造函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-13
    • 2012-10-15
    • 1970-01-01
    • 1970-01-01
    • 2020-11-06
    相关资源
    最近更新 更多