gpt4 book ai didi

javascript - 如何序列化对象并将其转换回与原始对象相同的类

转载 作者:行者123 更新时间:2023-11-28 03:10:42 25 4
gpt4 key购买 nike

我是 JavaScript 新手,所以如果我问的不是“你如何在 JavaScript 中做到这一点”,请耐心等待。欢迎就其他方法提出建议。

我有一个名为 State 的类,我需要使用 JSON.stringify() 序列化该类的对象。下一步是将它们反序列化回对象。但是,我的类使用 setter 和 getter。

我面临的问题是,在我反序列化这些对象后,setter 和 getter 似乎消失了。我只是不知道如何正确地将序列化对象转回该类的对象,以便它们的行为与直接使用 new 创建的对象完全相同。

在另一种语言中,我会将这些对象转换为 State 对象。我找不到似乎可以这样工作的 JavaScript 机制。

代码如下:

class State {
constructor(href) {
this.url = href;
}

set url(href) {
this._url = new URL(href);
this.demoParam = this._url.searchParams.get("demoParam");
}

get url() {
return this._url;
}

set demoParam(value) {
let param = parseInt(value, 10);
if(isNaN(param)) {
param = 2;
}
console.log("Setting 'demoParam' to value " + param);
this._demoParam = param;
}

get demoParam() {
return this._demoParam;
}

toJSON() {
let stateObject = {};
const prototypes = Object.getPrototypeOf(this);
for(const key of Object.getOwnPropertyNames(prototypes)) {
const descriptor = Object.getOwnPropertyDescriptor(prototypes, key);
if(descriptor && typeof descriptor.get === 'function') {
stateObject[key] = this[key];
}
}
return stateObject;
}
}

let originalState = new State(window.location.href);

let newState1 = JSON.parse(JSON.stringify(originalState));
newState1.demoParam = 12;

let newState2 = Object.create(State.prototype, Object.getOwnPropertyDescriptors(JSON.parse(JSON.stringify(originalState))));
newState2.demoParam = 13;

let newState3 = Object.assign(new State(window.location.href), JSON.parse(JSON.stringify(originalState)));
newState3.demoParam = 14;

let newState4 = Object.setPrototypeOf(JSON.parse(JSON.stringify(originalState)), State.prototype);
newState4.demoParam = 15;

我希望每次设置 newStateX 对象的 demoParam 属性时,我都会看到一条控制台日志消息。然而。我只看到它两次,即对于每个 new State(window.location.href) 语句。

我已经使用了this的答案问题。但是,它并没有按预期工作。

最佳答案

当您序列化一个对象时,您会触发类实例的 toStringtoJSON 方法,并最终得到可枚举属性的“哑”JSON 表示形式.

如果您想重新创建一个行为与序列化之前相同的实例,您需要在 toJSON 函数中设置一个额外的键/值对,例如 ___internalType: 'state' ,然后再设置使用例如。 switch 语句,用于使用 new MyClass(serializedData) 重新创建特定类并传入序列化实例。在类的构造函数中,您设置了所需的所有属性,瞧,您又拥有了“旧”实例

/edit:澄清控制台日志未显示的原因是因为您没有重新创建类的实例,而只是创建一个新的普通对象。

关于javascript - 如何序列化对象并将其转换回与原始对象相同的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60153089/

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