我正在尝试使用
Object.setPrototypeOf
来重新设置已转换为 JSON 并返回到对象的对象的原型。然而,instanceof
似乎并没有按照我期望的方式工作:
class Foo {}
const obj = {};
Object.setPrototypeOf(obj, Foo);
console.log(obj instanceof Foo);
为什么会这样?据我所知,
instanceof
的工作原理是将给定对象的原型与引用的类进行比较。有什么不同的方法可以做到这一点吗?
JS 类只是构造函数和原型的语法糖。 Foo 是构造函数,而不是原型...所以你需要使用
Foo.prototype
而不是 Foo
:
Object.setPrototypeOf({ }, Foo.prototype)
但是,由于 MDN 上的警告:
,我不会在您的用例中推荐这种方法改变一个对象的[[原型]],本质上是如何改变的 现代 JavaScript 引擎优化属性访问,速度非常慢 操作
相反,请使用
Object.create()
:
const obj = Object.create(Foo.prototype)
然后您可以使用
Object.assign()
复制数据(假设 data
是您解析的 JSON 数据):
Object.assign(obj, data)
或者,如果你的类有一个构造函数,允许你从参数设置其初始状态,你可以只使用
new Foo(data)
,但上面的方法更通用,因为它绕过了构造函数。