我正在尝试使用Object.setPrototypeOf
重新设置已转换为JSON并返回到对象的对象的原型。但是,instanceof
似乎并没有像我期望的那样发挥作用:
class Foo
{
}
Object.setPrototypeOf({ }, Foo) instanceof Foo; // Returns false
为什么会这样?据我所知instanceof
基于将给定对象的原型与引用的类进行比较。是否应采取不同的方式?
答案 0 :(得分:3)
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)
,但上述方法更通用,因为它绕过了构造函数。