Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将Object.setPrototypeOf与instanceof一起使用_Javascript_Typescript_Object_Ecmascript 6_Prototype - Fatal编程技术网

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)