2010-11-04 82 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