但早期的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
沒有留言:
張貼留言