将Object.setPrototypeOf与instanceof

时间:2018-03-26 00:39:07

标签: javascript typescript object ecmascript-6 prototype

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

class Foo
{

}

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

为什么会这样?据我所知instanceof基于将给定对象的原型与引用的类进行比较。是否应采取不同的方式?

1 个答案:

答案 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),但上述方法更通用,因为它绕过了构造函数。