2

JSONから作成されたJavaScriptオブジェクトがあります。JS5のゲッターとセッターがあるため、プロトタイププロパティを別のオブジェクトに設定する必要があります。Chromeで動作する必要なものの例を次に示します。

function MyObj() { }
MyObj.prototype = { 
  get myProp : function () { return this._myProp; },
  set myProp : function (arg) { this._myProp = arg; }
}

... stuff ...

var instance = JSON.parse(result);
instance.constructor = MyObj;
instance.__proto__ = MyObj.prototype;

このコードをinstance使用すると、プロトタイプで定義されたゲッターとセッターを使用してプロパティを取得および設定できます。ただし、これは移植性がなく、IEでは機能しません(ノードでもないと思います)。

これを行うための適切でポータブルな方法は何ですか?

4

2 に答える 2

2

逆に考えてください:

の新しいインスタンスを作成してからMyObj、のプロパティをコピーしますinstance。またはMyObj、引数を指定するときに、それを行うコンストラクターを指定します。

function MyObj(instance) {
 if (instance) {
   //copy properties

このようにして、あなたもできるかもしれません

var instance = new MyObj(JSON.parse(result));
于 2013-03-18T20:33:48.020 に答える
1

JSONリバイバー関数を使用してみることができます。

function revive(json) {

  var m = new MyObj(), y;

  return JSON.parse(json, function(k, v){ 
    if (!y) y = this; 
    return k == "" ? m : this == y ? m[k] = v : v 
  });

}

を呼び出すと、JSON文字列で定義されたプロパティrevive('... a json string ...')を持つのインスタンスが吐き出されます。MyObj

警告:これは、JSONオブジェクトの最初のアイテムがプリミティブ値である場合にのみ機能します。あなたのケースでそれが不可能な場合は、かなり醜い回避策があります:

function revive(json) {

  var m = new MyObj(), c = json.charAt(0), y, a;

  if (c == '[') {
    a = json = '[0,' + json.substring(1);
  } else if (c == '{') {
    json = '{"@":0,' + json.substring(1);
  }

  return JSON.parse(json, function(k, v){ 
    if (!y) { y = this; return; } 
    return k == "" ? m : this == y ? m[a ? k - 1 : k] = v : v 
  });

}
于 2013-03-18T20:53:21.373 に答える