【问题标题】:How to set a prototype for a JSON object?如何为 JSON 对象设置原型?
【发布时间】:2011-05-05 01:32:24
【问题描述】:

我正在从服务器接收一些 JSON 对象,我想将其“类型转换”或“祝福”到具有已定义方法的对象。有没有办法为纯 JSON 对象设置原型?

function MyClass(someValue) {
    this.myProperty = someValue;
}

MyClass.prototype.someMethod = function() { return "Here's " + this.myProperty + "!"};

var json = {myProperty : 'someValue'};

// ??? json.prototype = MyClass doesn't work, of course.

var result = json.someMethod();

我该怎么做?

【问题讨论】:

    标签: javascript oop json casting


    【解决方案1】:

    好的。这是答案(与 IE 不兼容):

    json.__proto__ = MyClass.prototype;
    

    谢天谢地,我的应用程序中不需要 %$@$%# IE。

    (当我这样做时,还有另一种可能性:在 MyClass 原型中创建一个包装函数,它将所有属性从 JSON 复制到新对象;浅复制就足够了)。

    【讨论】:

    • 我不知道这是否适用于 Safari 或 Chrome。您所说的“其他可能性”实际上是最好的方法。
    • @Pointy 我已经测试过了,确实如此。对于 IE,我发现了一个很酷的 hack,可以用来代替 protowebmasters.am/blog/tag/__proto__.
    • 好的,好吧,它不是标准化的(即使使用 ECMAScript 5),所以使用风险自负:-)
    • @pointy - 哈哈。首先是“好的部分”,现在是“坏的部分”。我知道谁写了第一个,看起来其他人正在尝试写第二个。
    • 找到与我自己当前的问题相匹配的完美问题真是令人失望,但答案却不适合我的需求。复制属性似乎没有灵丹妙药那么迷人!
    【解决方案2】:

    嗯,我可以建议试试这些:

    • 通过向所有 Javascript 对象添加所需的函数(不好的做法)

      Object.prototype.lol = function() { alert(this.a); };
      var x = {a : 'b'};
      x.lol();
      
    • 通过使用函数“扩展” JSON:

      var json = {a : 'b', b : 123};
      function extend(obj) {
          obj.func1 = function(param) {
              alert(this[param]);
          }
      }
      extend(json);
      json.func1('b');
      
    • 通过将对象“制作”为函数:

      var json = {a : 'b', b : 123};
      function extendToFunc(obj) {
          var theLibrary = function(obj) {
              /**
               * The same as above.
              */
              this.func1 = function(param) {
                   alert(obj[param]);
              }
          };
          return new theLibrary(obj);
      }
      var jsonFunc = extendToFunc(json);
      jsonFunc.func1('b');
      

    或者您可以为此使用 JS 框架。或者你能想到的任何其他方法:) 我的例子很简单,它们可以扩展到你需要的任何复杂的东西。

    【讨论】:

    • 手动一一添加这些函数违反了程序员最重要的美德:懒惰。
    • 您不必手动添加它们。您可以为此构建一个小型框架。它将添加您可能希望的所有必要方法 - 您只需通过该框架传递所有 JSON。我认为将函数添加到一个“扩展”方法/函数而不是使用 .prototype 并没有太大区别。而且我认为我的方法更适合分析应用程序的流程、调试。
    猜你喜欢
    • 2019-11-08
    • 2016-06-07
    • 2012-08-25
    • 2018-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-06
    • 2012-08-01
    相关资源
    最近更新 更多