2011年10月27日 星期四

偏好的 JavaScript Class 實作『基本款』

Standard

最近有一些想法,便和伙伴在空閒時間寫一些 Prototype 的專案,既然是嘗試形態的專案開發,就不必考慮穩定性和熟悉度,也不用顧慮失敗的問題,可以盡情玩弄新的,或是過去不常使用的技術。所以,這次使用了 nodejs + express + HTML5 來開發,大玩 JavaScript。

JavaScript 雖然看起來像 Java,但畢竟它不是真的 Java,很多功能考量以易於使用為優先,所以並不嚴謹,一些功能也因此被拿掉。畢竟,當初被設計出來只是為了讓『網頁動起來』,並沒有考量太多。但是隨著需求大增,而現在我們所看到的 JavaScript ,已經是一層層為了需求而疊出來的產物,其不旦保留與舊的 JavaScript 相容,又要擴充物件導向的現代化語言特性,這也是為什麼使用起來總是沒有一個固定的模式。

筆者過去總苦惱 JavaScript 的寫法變化太大,在過程中跌跌撞撞,雖寫了不少 Code,但總是覺得不順手,非常想尋求一個 JavaScript 設計模式的『基本款』,也希望和開發伙伴們有共同遵循的標準,讓專案更容易維護。

經過和隊友們的一番討論,總算有一些結論:
/* Example Class */
var Example = function() {
    /* Private */
    var Status = 0;
    var doms = {
        object: false;
    };
    var subObject = false;

    /* Constructor */
    subObject = new OtherClass();
    doms.object = document.createElement('div');

    /* Public */
    return {
        setStatus: function(_status) {
            Status = _status;
        },
        getStatus: function() {
            return Status;
        },
        getDOMs: function() {
            return doms;
        },
        getOtherClass: function() {
            return subObject;
        },
        Run: function() {
            /* Call own methods */
            this.setStatus(2);
            this.getStatus();
        }
    };
};
然後我們可以用這樣的方式使用定義出來的物件:
/* Create a new Example Object */
var ex = new Example();

/* Set to private variable */
ex.setStatus(1);

/* Get something from private area */
ex.getDOMs().object;

/* Using subObject's Methods */
ex.getOtherClass().publicMethods()
其實有寫 OO 的人,不管換到哪一種語言,第一時間都會尋找如何實作私有(Private)、公用(Public)和 Class 的寫法,不過,和其他語言不一樣的是, JavaScript 卻有很多種方式可以達成。當然,這邊只是列出我們比較偏好的寫法,供讀者們參考。