跟我一塊兒學NodeJS,基礎篇(四)

因爲工做緣由,小編將近一週沒寫文章了,在這裏給你們道個歉。在上一篇的內容裏,小編介紹了關於網絡請求和響應的詳細使用方法,今天小編和你們聊一聊NodeJS中類的概念,以及如何實現繼承關係,最後介紹下NodeJS中經常使用的一些設計模式。 


模塊與類所謂的模塊,就是程序設計中,爲了完成某一功能所需的一段程序或子程序;或指能由編譯程序、裝配程序等處理的獨立程序單位;或指大型軟件系統中的一部分。 
在NodeJS中能夠理解爲爲完成某一功能所需的程序或子程序,同時也能夠將NodeJS的一個模塊理解爲一個「類」,須要注意的是自己並不是是類,而只是簡單意義上的一個對象,該對象能夠擁有多個方法和屬性,例如咱們新建一個module.JS,例以下面代碼所示:前端

.==.=(itemName){
    (!itemName){
        ()
    }{
        (itemName)}
}
.=(){
    .()}
(myname){
    =myname}
代碼說明
  • exports.name:模塊的公有屬性 name
  • var myName:模塊的私有屬性 myname
  • exports.init:模塊公有方法 init
  • exports.show:模塊公有方法show
  • function setName(myName):模塊私有方法 setName

通常來講 exports 和 module.exports 的成員爲公有成員,而非exports 和 module.exports的成員爲私有成員。web


接下來咱們新建一個showModule.js的文件來驗證咱們的結論。 編程

=().(.).().().(.myname)

獲取Person對象,輸出相關的公有成員,而後在測試下私有成員myname是否能夠調用,執行完showModule.js後,返回結果以下: 
設計模式

結果中第一行輸出的是公有變量name,其次執行init初始化和show方法輸出結果,最後輸出Person的私有變量未定義。最後強調一下,NodeJS模塊不是類。
NodeJS中的繼承繼承的方法主要經過NodeJS的 unit 模塊 inherits API 來實現繼承(util.inherits(constructor, superConstructor)),將一個構造函數的原型方法繼承到另外一個構造函數中。constructor構造函數的原型設置爲使用superConstructor構造函數所建立的一個新對象。

下面咱們來查看官網的例子,其目的的使用 MyStream 繼承 events.EventEmitter 對象。示例代碼以下:網絡

= ()= ()() {
    .()}

.()..= (data) {
    .(data)}= ().().(.super_ === ).(() => {
    console.log(`Received data: `)}).()
代碼說明


  • function Mystream(){}: 目的是使用MyStrem 來繼承  events.EventEmitter 的方法屬性;
  • MyStream.prototype.write():爲MyStream添加方法;
  • var stream=new Mystream():建立Mystream對象;
  • console.log(stream instanceof EventEmitter):判斷是否繼承events.EventEmitter;
  • console.log(MyStream.super_ === EventEmitter):經過super_獲取父類對象;
  • stream.on():調用繼承來自 events.EventEmitter 的方法。

下面小編帶着你們親自完成一個繼承實例,例如學生繼承人這個類,首先咱們來建立一個Person的基類,示例代碼以下:app

.=(){
    .=.=(){
        .()}
    .=(){
        .()}
}

接下來咱們建立一個student類繼承person類,且是一個動態的student類,代碼以下:ide

=()=()(){
    .call()}
.()..=(){
    .()}
.=

最後咱們在app.js在引用person,student類,同時調用自身特有的方法,代碼以下:函數

=()=()=()=().().().().().().().().().()

運行app.js,從下圖的運行結果咱們成功的實現了類的繼承關係。學習



接下來,你會問小編,如何重寫父類的方法,那就須要在子類的方法中添加被繼承類的方法,如建立overload.js,代碼以下: 測試

=()=()(){
    .call().=(){
        .()}
}

.().=

在上面的例子中,咱們都是經過new的方法動態調用student方法,有沒有使用靜態的方法進行調用呢,就無需咱們每次調用時,new一個對象了,答案確定是的有,具體代碼以下:

=()=()(){
    .call().().=(){
        .()}
}
=().=..=..=.

而後咱們新建一個appstatic.js文件,經過靜態的方法調用剛纔改寫的方法 ,具體代碼以下:

=().().().()

這樣調用是否是特別簡單呢,這樣作的好處使咱們能夠避免代碼的冗餘。固然不是全部的類能夠這樣調用,若是每次new一個對象都須要初始一些變量的值,小編建議選擇使用動態建立的方法。

接下來小編給你們一塊兒瞭解經常使用的設計模式:單例模式、適配器模式、工廠模式 。


單例模式單例模式就比如之前的計劃生育,只能生一個(如今能生兩個了,你們放心的生吧,嘿嘿!),說專業點就是保證一個實例,並提供一個訪問它的全局訪問點。
一般咱們可讓一個全局變量讓一個對象進行調用,但它不能防止你實例多個對象。一個最好的辦法就是,讓類自身負責保存它的惟一實例。這個類能夠保證沒有其餘實例能夠被建立,而且它能夠提供一個訪問該實例的方法。具體思路請參照下圖:

NodeJS中利用模塊實現單例模式的方法和上述思想一致,下面咱們來建立一個single_class.js方法實現單例模式,代碼以下:

=.=(name){
    (name){
        .=name.=.=}
    .={
        ::(){
            .(+.++.++.)}

    }
    .=(){
        (===){
            =(name)
        }
        }
}

接下來,咱們建立single_App.js來驗證是否實現了單例模式,代碼以下:

=()=()=.().()singleObj2=Single()singleClass2=singleObj2.getInstance()singleClass2.show()
接下來咱們運行相關代碼
從運行結果能夠看出,咱們的單例模式奏效了,傳遞不一樣的名稱,singleObj2的名稱沒法覆蓋singleObj1,主要是單例模式判斷是否new了新對象,因此顯示的都是前端達人。 
適配器模式何爲適配器模式,如今里約奧運會如火如荼,若是你有幸現場觀看節目,是否是想身邊有一個翻譯,說通俗一點,你在哪看比賽,你身邊的翻譯就能把結果翻譯成你能懂的中文,說專業點就是將一個類的接口轉換成客戶但願的另一個接口。適配器模式使得本來因爲接口不兼容而不能一塊兒工做的那些類能夠一塊兒工做。

依據上圖,咱們一塊兒建立三個類,Target,Adapter和Adaptee。Adapter 調用 Adaptee中方法的具體實現。建立一個Target類,其中包含request方法,代碼以下:

.=(){
    .=(){
        .()}
}

建立Adaptee類,實現specialRequest方法,代碼以下

.=(){
    .=(){
        .()}
}

建立Adapter(適配器)類,繼承Target類,並重寫其request方法,代碼以下:

=()=()=()(){
    .call().=(){
        =().()}
}
.().=

最後咱們建立腳本client.js調用適配器中request的方法,代碼以下:

=()=().()
執行完client.js返回結果以下:


從運行結果能夠看出,適配器調用了Adaptee 中的 specialRequest 方法,這樣就實現了NodeJS編程下的適配器模式。 


工廠模式定義一個用於建立對象的接口,讓子類決定將哪個類實例化。工廠模式使一個類的實例化延遲到其子類。工廠模式的示意圖以下: 圖片接下來,小編帶着你們一塊兒來實現上圖的思想,建立一個Product基類,同時添加getProduct方法,代碼以下:
.=(){
    .=(){
        .()}
}
建立兩個繼承於product類 的ProductA 類和 ProductB 類 ,代碼以下:
=()=()(){
    .call().=(){
        .()}
}
.().=
productA 和 productB 實現方法是同樣的,小編就不在這裏囉嗦了。接下來經過productFactory 來建立工廠對象,根據不一樣的參數獲取不一樣的參數對象,具體的代碼以下:
=()=().=(type){
    (type){
        : 
            ():
        :
            ()}
}
建立client.js, 使用productFactory來調用creatProduct 建立Product對象,具體代碼以下:
=()=.().()=.().()
運行Client.js的結果以下圖 : 圖片從結果能夠看出經過傳遞不一樣的字符串,分別獲取了ProductA 和 ProductB,這樣咱們輕鬆完成了一個簡單的工廠模式。

圖片關於今天的內容小編就介紹到這裏,咱們學習了在NodeJS中的對象、類和模塊的區別和聯繫,以及類之間的繼承關係如何實現,以及一些經常使用的設計模式。想必你們的收穫是滿滿的,接下來的內容小編將帶着你們一塊兒學習下web開發中經常使用的一些基礎概念、方法和技巧。
相關文章
相關標籤/搜索