2012-05-27 56 views
4

如何在Javascript中實現繼承?我開始使用Knockout.js並實現ViewModels/page。不過,我有一些函數/代碼,我希望它在所有ViewModels中共享。如何在JavaScript中實現繼承?

我想知道如何在這種情況下實現繼承?

+0

[here](http://www.codeproject.com/Articles/303796/How-to-Implement-Inheritance-in-Javascript)你會找到你所需要的。 – Sajmon

+1

[在Javascript中執行繼承]的可能重複(http://stackoverflow.com/questions/1586915/performing-inheritance-in-javascript) – JJJ

+0

或者您可以使用coffeescript方式並使用它的語法來創建類並從一個類繼承另一個。更多的細節在coffeescript.org上。最後,它編譯爲標準的OO javascript,但在處理類時要讀取和寫入更容易。 – Tallmaris

回答

6

繼承可能不一定是答案。爲什麼不用每個ViewModel應該實現的所有方法創建一個對象字面值。我不熟悉淘汰賽,但以下是您可以在本地js中完成的方式。

var sharedMethods = { 
      run: function() {}, 
      jump: function() {} 
     }; 

    function Person() {}; 
    // Use jQuery's extend method 
    // Now person has run, jump, and talk 
    $.extend(Person.prototype, sharedMethods, { 
     talk: function() {} 
    }); 
+0

你建議的是在基於原型的OO中繼承的實際內容(我支持你的解決方案) – lanzz

+0

酷!我喜歡你的解決方案,很容易理解和實施。 –

+0

在js中,我會在原型鏈之後調用實現繼承。不只是實施一套共享的方法。 – Trevor

0

Here's the link from crockford.com
它最好的地方,瞭解面向Javascript對象什麼。
雖然他的方法起初並不太明白。由於他持續參與JavaScript語言的開發,推廣數據格式JSON(JavaScript Object Notation)以及開發各種與JavaScript相關的工具,如JSLint和JSMin,因此最出名的最佳資源之一是 。

2

JavaScript提供了原型繼承。對象從其他對象繼承。這對於方法繼承來說可以很好,但對於屬性繼承不起作用。

通常繼承方法,你可以使用:

function BaseViewModel() { 
    var self = this; 
    self.name = ko.observable(); 
} 

function Person() { 
    var self = this; 
    self.firstname = ko.observable(); 
} 

Person.prototype = new BaseViewModel(); 

但是,這會導致所有的人共享同一個對象作爲原型!當你改變一個人的名字時,價值get會傳播給所有的人。我傾向於使用jQuery的擴展方法。

function Person() { 
    var self = this; 
    $.extend(self, new BaseViewModel()); 

    self.firstname = ko.observable(); 

}

這樣從BaseViewModel值被複制到人。