【问题标题】: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 的工作原理是将给定对象的原型与引用的类进行比较。有没有其他方法可以做到这一点?
【问题讨论】:
标签:
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),但是上面的方法更通用,因为它绕过了构造函数。