在创建对象后,设置prototype属性的可移植方式是什么?

时间:2013-03-18 20:09:09

标签: javascript prototype

我有一个从JSON创建的JavaScript对象。我真的需要将其prototype属性设置为不同的对象,因为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;

使用此代码,我可以使用原型中定义的getter和setter在instance上获取和设置属性。但是,这不是可移植的,不适用于IE,(我认为也不是节点)。

这样做的正确和便携方式是什么?

2 个答案:

答案 0 :(得分:2)

反思:

创建MyObj的新实例,然后将instance的属性复制到其中。或者为MyObj提供一个构造函数,当你为它提供一个参数时:

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

这样你甚至可以做到

var instance = new MyObj(JSON.parse(result));

答案 1 :(得分: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 ...'),它将使用JSON字符串中定义的属性吐出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 
  });

}