代码之家  ›  专栏  ›  技术社区  ›  Alexander Temerev

如何为JSON对象设置原型?

  •  4
  • Alexander Temerev  · 技术社区  · 14 年前

    我正在从服务器接收一些JSON对象,我想将其“typecast”或“bless”到具有已定义方法的对象。有没有办法为一个简单的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();
    

    我该怎么做?

    2 回复  |  直到 14 年前
        1
  •  3
  •   GitaarLAB    10 年前

    好吧,我建议你试试这些:

    • 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框架。或者你能想到的任何其他方法:)我的例子很简单,它们可以扩展到你需要的任何复杂的东西。

        2
  •  1
  •   Alexander Temerev    14 年前

    好 啊。答案如下(不兼容):

    json.__proto__ = MyClass.prototype;
    

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