Javascript 将Object.setPrototypeOf与instanceof一起使用
我试图使用Javascript 将Object.setPrototypeOf与instanceof一起使用,javascript,typescript,object,ecmascript-6,prototype,Javascript,Typescript,Object,Ecmascript 6,Prototype,我试图使用Object.setPrototypeOf重新设置已转换为JSON并返回到对象的对象原型。然而,instanceof似乎并不像我期望的那样工作: class Foo { } Object.setPrototypeOf({ }, Foo) instanceof Foo; // Returns false 为什么会这样?据我所知,instanceof的工作原理是将给定对象的原型与引用的类进行比较。有没有其他方法可以做到这一点?JS类只是构造函数和原型的语法糖。Foo是构造函数,而不是
Object.setPrototypeOf
重新设置已转换为JSON并返回到对象的对象原型。然而,instanceof
似乎并不像我期望的那样工作:
class Foo
{
}
Object.setPrototypeOf({ }, Foo) instanceof Foo; // Returns false
为什么会这样?据我所知,
instanceof
的工作原理是将给定对象的原型与引用的类进行比较。有没有其他方法可以做到这一点?JS类只是构造函数和原型的语法糖。Foo是构造函数,而不是原型…因此您需要使用Foo.prototype
而不是Foo
:
Object.setPrototypeOf({ }, Foo.prototype)
但是,我不推荐这种方法用于您的用例,因为:
改变对象的[[Prototype]]是
现代JavaScript引擎优化属性访问,速度非常慢
操作
相反,请使用Object.create()
:
然后可以使用Object.assign()
复制数据(假设data
是您解析的JSON数据):
或者,如果您的类有一个构造函数,允许您通过参数设置其初始状态,您可以只使用
new Foo(data)
,但上述方法更通用,因为它绕过了构造函数。@MattBrowne请提交答案;我会接受的。
const obj = Object.create(Foo.prototype)
Object.assign(obj, data)