2012-03-06 75 views
3

我的最终任务是完全恢复对象使用JSON以前保存。目前JSON只允许恢复数据,但不允许行为。 possilbe的解决方案是创建一个新的对象(让我们称之为obj)并将数据从JSON-recovered-object复制到obj。但它对我来说并不好看。我问的是,有没有办法在JavaScript中动态更改对象原型?动态变化的原型JavaScript对象

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

(this code on JSFiddle)

function Obj() { 
    this.D = "D"; 
    this.E = "E"; 
    this.F = "F"; 

    this.toString = function() { 
     return this.D + " * " + this.E + " * " + this.F; 
    }; 

    this.copy = function (anotherObj) { 
     for (var property in anotherObj) { 
      if (isDef(anotherObj[property]) && isDef(this[property])) { 
       this[property] = anotherObj[property]; 
      } 
     } 
    } 
} 
; 

$(document).ready(function() { 
    var str = $.toJSON(new Obj()); 
    $("#result").append("<p>JSON: " + str + "</p>"); 
    var obj = new Obj(); 
    obj.copy($.parseJSON(str)); 
    $("#result").append("<p>Recovered obj: " + obj.toString() + "</p>"); 
}); 

function isDef(variable) 
{ 
    return typeof variable !== undefined; 
} 

回答

4

有许多流行的JS库提供更简单的方法。

例如,如果你使用jQuery,您可以使用jQuery.extend()方法,而不是你的复制功能,像这样:

var obj = $.extend(new Obj(), $.parseJSON(str)); 

歧路的jsfiddle here

编辑:基于从this question的想法,我是能够得到恢复的对象都嵌套功能好,看到updated jsFiddle

的核心思想是利用原型代替性能,并确保从JSON(这仅仅是数据)恢复的对象是第一参数$.extend()

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>"); 
+0

感谢。这正是我所期待的。很遗憾它没有,如果有对象下地干活:http://jsfiddle.net/mr_goodcat/KfQrc/2/ – 2012-03-06 08:13:27

+0

更新:看来“深拷贝”应该是一个解决方案,但我不能使它工作在行为的一部分(数据恢复): http://jsfiddle.net/mr_goodcat/KfQrc/3/ – 2012-03-06 08:36:17

+0

呀,我不能得到那个工作,无论是。复制嵌套的原型目前非常棘手,超出了我的想象。 – GregL 2012-03-06 09:04:50