动态更改JavaScript对象的原型
我的最后一项任务是完全恢复以前使用JSON保存的对象。目前,JSON只允许恢复数据,而不允许恢复行为。一个可能的解决方案是创建一个新对象(我们称之为obj)并将数据从JSON恢复的对象复制到obj。但它对我来说并不好看。我想问的是,有没有一种方法可以动态地改变JavaScript中的对象原型 这就是我目前解决问题的方法(使用自制复制方法):动态更改JavaScript对象的原型,javascript,json,Javascript,Json,我的最后一项任务是完全恢复以前使用JSON保存的对象。目前,JSON只允许恢复数据,而不允许恢复行为。一个可能的解决方案是创建一个新对象(我们称之为obj)并将数据从JSON恢复的对象复制到obj。但它对我来说并不好看。我想问的是,有没有一种方法可以动态地改变JavaScript中的对象原型 这就是我目前解决问题的方法(使用自制复制方法): 函数Obj(){ 这个.D=“D”; 这个.E=“E”; 这个.F=“F”; this.toString=函数(){ 返回此.D+“*”+此.E+“*”+
函数Obj(){
这个.D=“D”;
这个.E=“E”;
这个.F=“F”;
this.toString=函数(){
返回此.D+“*”+此.E+“*”+此.F;
};
this.copy=函数(另一个对象){
for(另一个对象中的var属性){
if(isDef(其他对象[属性])和&isDef(此[属性]){
此[属性]=另一个对象[属性];
}
}
}
}
;
$(文档).ready(函数(){
var str=$.toJSON(new Obj());
$(“#结果”)。追加(JSON:“+str+””);
var obj=新obj();
obj.copy($.parseJSON(str));
$(“#结果”).append(恢复的对象:“+obj.toString()+””;
});
函数isDef(变量)
{
返回变量的类型!==未定义;
}
许多流行的JS库提供了更简单的方法
例如,如果您使用的是jQuery,则可以使用该方法而不是复制函数,如下所示:
var obj = $.extend(new Obj(), $.parseJSON(str));
叉形叉
编辑:基于来自的想法,我能够使恢复的对象也具有所有嵌套功能,请参见
核心思想是使用原型而不是属性,然后确保从JSON恢复的对象(只是数据)是$的第一个参数。extend()
:
函数Obj2(){
这一点。A=“A”;
}
Obj2.prototype.toString=函数(){
归还这个;
};
函数Obj(){
this.A=新的Obj2();
这个.D=“D”;
这个.E=“E”;
这个.F=“F”;
}
Obj.prototype.toString=函数(){
返回this.A.toString()+“*”+this.D+“*”+this.E+“*”+this.F;
};
var str=$.toJSON(new Obj());
$(“#结果”)。追加(JSON:“+str+””);
var obj=jQuery.extend($.parseJSON(str),new obj());
$(“#结果”).append(恢复的对象:“+obj.toString()+””;
谢谢。这就是我要找的。遗憾的是,如果有对象字段,它就不起作用了:更新:似乎“深度复制”应该是一个解决方案,但我无法在行为部分(数据被恢复)使它起作用:是的,我也无法让它起作用。复制嵌套原型是一件棘手的事情,目前我还无法理解。哟!你做到了!谢谢。另外,它似乎也以旧的方式工作:,因此将参数交换到extend方法才是关键。关键更新:看来您的解决方案根本不起作用。通过交换参数,我们可以恢复行为并删除所有JSON恢复的数据((
var obj = $.extend(new Obj(), $.parseJSON(str));
function Obj2() {
this.A = "A";
}
Obj2.prototype.toString = function() {
return this.A;
};
function Obj() {
this.A = new Obj2();
this.D = "D";
this.E = "E";
this.F = "F";
}
Obj.prototype.toString = function() {
return this.A.toString() + " * " + this.D + " * " + this.E + " * " + this.F;
};
var str = $.toJSON(new Obj());
$("#result").append("<p>JSON: " + str + "</p>");
var obj = jQuery.extend($.parseJSON(str), new Obj());
$("#result").append("<p>Recovered obj: " + obj.toString() + "</p>");