2012-03-06 13 views
3

最後に、JSONを使用して以前に保存したオブジェクトを完全に回復することです。今のところ、JSONはデータのリカバリのみを許可しますが、動作は許可しません。解決策は、新しいオブジェクトを作成し(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

EDIT: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/ –

+0

更新:「ディープコピー」は解決策に見えますが、動作させることはできません(データが復旧しました): http://jsfiddle.net/mr_goodcat/KfQrc/3/ –

+0

ええ、私もそれを動作させることができませんでした。入れ子にされたプロトタイプをコピーするのは難しいし、今のところ私を超えている。 – GregL

関連する問題