为什么将对象的原型设置为 `Foo` 不会使其成为 `instanceof Foo`?

问题描述 投票:0回答:1

我正在尝试使用

Object.setPrototypeOf
来重新设置已转换为 JSON 并返回到对象的对象的原型。然而,
instanceof
似乎并没有按照我期望的方式工作:

class Foo {}

const obj = {};
Object.setPrototypeOf(obj, Foo);
console.log(obj instanceof Foo);

为什么会这样?据我所知,

instanceof
的工作原理是将给定对象的原型与引用的类进行比较。有什么不同的方法可以做到这一点吗?

javascript ecmascript-6 prototype instanceof
1个回答
5
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.