2013年10月4日 星期五

javascript namespace寫法筆記

javascript真是一個很好玩的東西,

但早期的javascript寫法非常freestyle,

雖然使用起來很簡單,容易學(或是說容易複製貼上) 

但freestyle的程式碼累積到一個數量時,就會變成一場災難, 

尤其是當讀過了JavaScript優良部分這本書之後,

更覺得以前年少無知的想法應該被更新。


其中,以封裝物件的方式來達到namespace的效果,算是相當實用的一個寫法,

試想,

當一群人共同開發一個javascript專案時,都使用全域的變數,全域的函數,

各人在各自的環境獨立測試時可能還沒甚麼問題,

但當這些人的開發的js檔被整進同一個網頁時,就可能產生大問題,

也就是當變數或函數名稱重複時,先載入的程式會被後載入的程式覆蓋,

(有時不要說是說多人共同開發,連一個人獨自開發都有可能發生這樣的烏龍)

因此我們可以透過namespace的方式解決這類問題,如下程式樣版所示:

var myUtil = myUtil || function() {

    //私有變數,外部程式不可見,只有在這個namespace內才可調用
    var privateProperty1 = "Hello";

    //私有變數,外部程式不可見,只有在這個namespace內才可調用
    var privateProperty2 = "World";

    //私有函數,外部程式不可見,只有在這個namespace內才可調用
    function privateMethod() {
        return privateProperty1 + privateProperty2;
    }
    return {

        //公開變數,外部程式可透過myUtil.publicProperty取得test這個值
        publicProperty: "test",

        //公開函數,外部程式可透過myUtil.publicMethod調用
        publicMethod: function() {
            return privateMethod();
        }
    }
}();

透過以上的分類方式,

所有的函數和變數都會依附在這個物件之下,好像namespace一樣,

若其他人要調用我的publicMethod,他可以這樣寫:

myUtil.publicMethod();

如此也就不用再擔心名稱重複的問題了,因為要調用我的函數前面必須指定myUtil物件,

除此之外的好處就是將公開和私有的成員分清楚,

需要給外部程式調用的函數或變數放在return裡面,

其他的邏輯都藏在物件裡面,外部程式不可見所以也無法調用,

物件導向的封裝概念就這樣被建立起來了,簡單明瞭!


==============================================================

2014/4/13更新:此設計模式正確名詞應該叫做Module Pattern

沒有留言:

張貼留言