转换为JSON并强制转换回对象后,缺少Javascript/TypeScript set/get属性

转换为JSON并强制转换回对象后,缺少Javascript/TypeScript set/get属性,javascript,Javascript,var-Greeter=/**@class*/(函数(){ 函数迎宾器(消息){ 这个。_问候语=信息; } Object.defineProperty(Greeter.prototype,“greet”{ get:function(){ 返回“你好,”+这个。_问候语; }, 设置:功能(消息){ 这个。_问候语=信息; }, 可枚举:正确, 可配置:true }); Greeter.prototype.toJSon=函数(){ 返回JSON.stringify(this); }; 回程迎宾员

var-Greeter=/**@class*/(函数(){
函数迎宾器(消息){
这个。_问候语=信息;
}
Object.defineProperty(Greeter.prototype,“greet”{
get:function(){
返回“你好,”+这个。_问候语;
},
设置:功能(消息){
这个。_问候语=信息;
},
可枚举:正确,
可配置:true
});
Greeter.prototype.toJSon=函数(){
返回JSON.stringify(this);
};
回程迎宾员;
}());
var greeter=新的问候者(“世界”);
var JsonObject=greeter.toJSon();
警报(JsonObject);
//{U问候语:““世界1”}-这很好。
var newGreeter=JSON.parse(JsonObject);
var button=document.createElement('button');
button.textContent=“打招呼”;
button.onclick=函数(){
警惕(newGreeter.greet);
//未定义--对象中缺少属性。
警报(新问候语);
//与“世界”配合很好
};

document.body.appendChild(按钮)您可以创建一个方法,将纯JSON对象(不包含方法)转换回类的对象:

function fromJSON(jsonString){
   var jsonObj = JSON.parse(jsonString);
   var greeter = new Greeter();
   return Object.assign(greeter, jsonObj);
}
Object.assign()
将第二个(第三个,…)对象的所有属性添加到第一个对象,因此您的Greeter对象现在具有以前的属性。

当您序列化(stringify)对象时,它必然会丢失除键值对以外的所有属性。无法序列化getter和setter(以及其他函数)

你能做的最好的事情就是用一个值填充
greet
,即使它没有setter/getter。如果希望
greet
属性在stringized对象中可用,则必须对实例化对象本身而不是原型调用
defineProperty
,以便
JSON.stringify(this)
成功调用getter:

var-Greeter=/**@class*/(函数(){
函数迎宾器(消息){
这个。_问候语=信息;
Object.defineProperty(这是“问候”{
get:function(){
返回“你好,”+这个。_问候语;
},
设置:功能(消息){
这个。_问候语=信息;
},
可枚举:正确,
可配置:true
});
}
Greeter.prototype.toJSon=function(){
log(JSON.stringify(this));
返回JSON.stringify(this);
};
回程迎宾员;
}());
var greeter=新的问候者(“世界”);
var JsonObject=greeter.toJSon();
var newGreeter=JSON.parse(JsonObject);
var button=document.createElement('button');
button.textContent=“打招呼”;
button.onclick=函数(){
console.log(newGreeter.greet);
控制台日志(newGreeter.\u greeting);
};

document.body.appendChild(按钮)
这个问题与typescript无关,只是一个小小的建议:如果你打算大量使用Javascript,尽量不要用传统意义上的“类型”和“类型转换”;真的没有这回事。如果你想要某种类型的东西,你必须创造一些新的东西。