2

我有一个从 JSON 创建的 JavaScript 对象。由于 JS5 getter 和 setter,我真的需要将它的原型属性设置为不同的对象。这是我需要在 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使用原型中定义的 getter 和 setter 获取和设置属性。但是,这不是可移植的,并且不适用于 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 reviver 函数。

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 
  });

}

调用revive('... a json string ...'),它将吐出一个MyObj具有 JSON 字符串中定义的属性的实例。

警告:这仅在您的 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 回答