gpt4 book ai didi

javascript - 在 Node.js 中反序列化后将对象与其类重新关联

转载 作者:数据小太阳 更新时间:2023-10-29 06:05:23 24 4
gpt4 key购买 nike

我正在为一些特定于应用程序的对象编写一个简单的序列化/反序列化框架。

考虑以下几点:

"use strict";
function Dog(name) { this._name = name; };
Dog.prototype.constructor = Dog;
Dog.prototype.getName = function() { return this._name; }

var d1 = new Dog('fido');
var d2 = JSON.parse(JSON.stringify(d1)); // serialize / deserialize

> d1
Dog { _name: 'fido' }
> d1.getName()
'fido'
> d2
{ _name: 'fido' }
> d2.getName()
TypeError: d2.getName is not a function

此时,可以问“d1 有什么而 d2 没有?”

一种部分有效的方法是手动将 d1 的方法分配给 d2:

> d2.constructor = d1.constructor
> d2.getName = d1.getName
> d2.getName()
'fido'

这有几个缺点。首先,我必须手动将 d1 的每个方法分配给 d2。其次,d2 获取自己的属性,并且不使用原型(prototype)机制共享槽:

> d2
Dog {
_name: 'fido',
constructor: [Function: Dog],
getName: [Function] }

所以我提炼的问题是:给定一个对象(例如d2),有没有办法将它与另一个对象(例如d1)的原型(prototype)相关联,所以它继承相同的行为?

最佳答案

Object.create()Object.getOwnPropertyDescriptors()正是您所需要的。

const obj = JSON.parse(JSON.stringify(d1))
const d3 = Object.create(Dog.prototype, Object.getOwnPropertyDescriptors(obj))

这个方法和OP的方法的区别在于,这个方法是在原型(prototype)上设置prototype属性,而OP的方法是直接在对象上设置属性。当您使用带有 hasOwnProperty() 方法的 for-in 循环遍历对象自身的属性时,您可以看到这一点:

for (const i in d1) {
if (d3.hasOwnProperty(i)) {
console.log(i)
}
}

用我的方法它只输出_name,但是用OP的方法它也输出getName

不幸的是,Object.getOwnPropertyDescriptors() 是 ECMAScript 2017 的一部分,目前仅在 Firefox 中受支持,因此您需要使用 Babel。


或者,您可以使用 Object.setPrototypeOf() .它比 Object.getOwnPropertyDescriptors() 有更好的浏览器支持,但 MDN 不鼓励它,因为它很慢。

const d3 = JSON.parse(JSON.stringify(d1))
Object.setPrototypeOf(d3, Dog.prototype)

关于javascript - 在 Node.js 中反序列化后将对象与其类重新关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38922990/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com