2010-11-04 54 views
4

我正在接收来自服务器的一些JSON对象,我想用已经定义好的方法''类型化'或'祝福'给一个对象。有没有办法为普通的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(); 

我该怎么做?

回答

1

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

json.__proto__ = MyClass.prototype; 

值得庆幸的是,我不需要任何%$ @ $%#IE在我的应用程序。

(当我这样做,还有另一种可能性:创建MyClass的原型的包装功能,将复制JSON的所有属性的新对象,浅拷贝应该是足够了)。

+1

我不知道这将在Safari或Chrome中起作用。你所描述的“其他可能性”实际上是最好的办法。 – Pointy 2010-11-04 13:54:52

+0

@Pointy我测试过了,它确实如此。对IE来说,我发现了一个很酷的黑客,可以用来代替__proto__:http://www.webmasters.am/blog/tag/__proto__/。 – 2010-11-04 13:58:04

+2

好吧,它不是标准化的(即使使用ECMAScript 5),请自行承担风险:-) – Pointy 2010-11-04 14:06:34

3

好吧,我可以建议尝试这些:

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

+2

手动添加这些函数一个接一个地违反了最重要的程序员的美德:懒惰。 – 2010-11-04 14:02:47

+1

您不必手动添加它们。你可以为此构建一个小框架。它会添加所需的所有必要的方法 - 您只需通过该框架传递所有JSON即可。我没有看到将功能添加到一个“扩展”方法/功能,而不是使用.prototype应用方面的很多不同。我认为我的方法更适合分析应用程序的流程,调试。 – 2010-11-04 14:14:31