2012-09-04 63 views
2

,而現在我一直在開發JavaScript應用程序,通常小的腳本來完成簡單的任務,而且還使用Dean Edwards' base2 library創建僞經典OO類一個相當龐大而複雜的應用程序寫一個整潔,靈活複雜的JavaScript應用程序與繼承,...在JavaScript中。如何使用原型繼承

的BASE2庫擔任我非常好,主要是因爲它使我能夠遵循經典OO範式,我很熟悉。我還知道可以用來構建更強大和成熟的JavaScript應用程序的其他幾個框架(例如,backbone.js)。但我始終認爲,這種類型的圖書館是一種'欺騙'的方式,構建一種使用語言實際上不適合的原則來編寫代碼的方法。

我一直在閱讀不同的方式來定義對象/函數,實例化它們並使用原型繼承實現多態。這實際上是語言在基本層面的工作原理,我覺得我應該利用這一點,而不是決定它是討厭還是奇怪,並試圖找到一種方法來按照我習慣的方式來做事情(經典的OO方式)。

因此,看看不使用這種類型的庫的應用程序,似乎有很多方法來編寫您的應用程序,而對於傳統的通用語言,如Java,C++,...構建應用程序的正確方法似乎更清楚地定義(區分好的代碼和錯誤代碼要容易得多)。如果有人明天問我:「開始爲我開發projectX」,我不知道如何開始定義和構造我的對象,我可以肯定,稍後重組時不會再回頭咬我整個東西。

會是什麼專業的複雜的JS應用骨架的樣子,使用原型繼承,所以不使用任何類型的庫用於模仿經典OO,假設一個簡單的MVC類型的應用程序,但很容易地擴展到更復雜的地步。如何定義我的對象?如何保持對象/「類」組合在一起(命名空間)?換句話說:如何做到這一點沒有結束一個混亂沒有人瞭解?

+1

的主要作者爲什麼不花一些時間在像骨幹,分機,子玉,角,等當前流行的框架東張西望?即使你不喜歡它們,這也是一種接觸建築模式的簡單方法。 – Pointy

+0

我確實看過其中的一些,但由於存在很多差異,我仍然不清楚最佳的解決方法。也許這太主觀了一個問題。 – Asciiom

+0

嗯,這是相當主觀的 - 我個人覺得我很少使用JavaScript的繼承,因爲我更喜歡通過語言的功能方面實現代碼重用。另外,我個人不喜歡客戶端應用程序邏輯的想法;我有很多*客戶端代碼,但它是關於客戶端功能,而不是應用程序邏輯。 **但那只是我的個人情況和意見。**我喜歡閱讀所有這些框架的功能,因爲我喜歡瞭解設計方法和編碼技術。 – Pointy

回答

6

在創建面向對象的Javascript類時,我遵循兩種模式(認爲JS中沒有真正的類,我們可以模仿它們)。首先是更家庭的OO方式並且易於理解。

// in JS, functions can be used as OO classes 
var Person = function(name) { 
    var self = this; 

    //private methods and attributes 
    this.getNickname = function(){ 
     return "Yaka"; 
    }; 

    //public methods and attributes (return obj) 
    return { 
     getName : function() { 
      return name + ' ' + self.getNickname(); 
     } 
    } 
}; 

//static functions attached to 'Person' class 
Person.hasBrain = function() { 
    return true; 
} 

該模型允許您爲您的類設置私有,公共和靜態部分,以實現良好的封裝。但這並不是最佳的方式,因爲每個對象都會攜帶所有實例方法的副本。您可避免的實例方法與基於原型編程的多個副本:

// in JS, functions can be used as OO classes 
var Person = function(name) { 
    this.name = null; 
}; 

// use of prototypes improves performance and memory use 
Person.prototype.getName = function() { 
    return this.name; 
} 

Person.prototype.setName = function(name) { 
    this.name = name; 
} 

這並不尋求傳統的面向對象編程非常熟悉並且,但是對於使用JavaScript資源的最佳途徑。它也適用於繼承。

var Manager = function() {} 
Manager.prototype = new Person(); 

在實踐中,我使用原型方法來處理在應用程序中大量使用的基類/框架類。對於偶爾或少數情況下使用的類,我使用前面討論的方法。

我還建議您使用諸如requirejs之類的AMD庫,併爲每個物理文件定義一個類。然後使用構建優化器將文件優化爲單個腳本。

我從BoilerplateJS參考架構中的單元測試中複製了上述2種方法。查看BoilerplateJS中的代碼,它將爲您提供更多有關如何使用JS處理複雜應用程序開發的想法。

免責聲明:我BoilerplateJS