动态更改JavaScript对象的原型

动态更改JavaScript对象的原型,javascript,json,Javascript,Json,我的最后一项任务是完全恢复以前使用JSON保存的对象。目前,JSON只允许恢复数据,而不允许恢复行为。一个可能的解决方案是创建一个新对象(我们称之为obj)并将数据从JSON恢复的对象复制到obj。但它对我来说并不好看。我想问的是,有没有一种方法可以动态地改变JavaScript中的对象原型 这就是我目前解决问题的方法(使用自制复制方法): 函数Obj(){ 这个.D=“D”; 这个.E=“E”; 这个.F=“F”; this.toString=函数(){ 返回此.D+“*”+此.E+“*”+

我的最后一项任务是完全恢复以前使用JSON保存的对象。目前,JSON只允许恢复数据,而不允许恢复行为。一个可能的解决方案是创建一个新对象(我们称之为obj)并将数据从JSON恢复的对象复制到obj。但它对我来说并不好看。我想问的是,有没有一种方法可以动态地改变JavaScript中的对象原型

这就是我目前解决问题的方法(使用自制复制方法):

函数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>");