Я новичок в JavaScript, так что потерпите меня, если я спрашиваю не «как вы это делаете в JavaScript». Советы по другим подходам приветствуются.
У меня есть класс с именем State
, и мне нужно сериализовать объекты этого класса, используя JSON.stringify()
. Следующим шагом будет их десериализация обратно в объекты. Однако мой класс использует сеттеры и геттеры.
Проблема, с которой я столкнулся, заключается в том, что после десериализации этих объектов сеттеры и геттеры, похоже, исчезли. Я просто не могу понять, как я могу правильно превратить сериализованные объекты обратно в объекты этого класса, чтобы они вели себя точно так же, как объекты, созданные с использованием 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;
Я ожидаю, что каждый раз, когда я устанавливаю свойство demoParam
объекта newStateX
, я буду видеть сообщение журнала консоли. Однако. Я вижу это только дважды, то есть для каждого оператора new State(window.location.href)
.
Я использовал ответ на этот вопрос. Однако это не работает должным образом.