JavaScript學習筆記(二十九) method()方法

method()方法

JavaScript很可能讓那些習慣了從類的角度思考的程序猿感動疑惑。這也是爲什麼一些程序猿選擇讓JavaScript更類一些(class-like)。
其中一種嘗試就是method()方法,這種方法讓JavaScript更class-like的方法不是一個被推薦的方式,然而它是一種有趣的模式,並且你可能在一些程序中無意間碰到過。

使用構造方法看起來就像在Java中使用類一樣,他們能讓你在構造方法中給this添加實例屬性(instance properties)。
然而給this添加方法是低效的,因爲它們最後在每個實例創建時都會被創新創建一次,這回消耗更多內存。這也是爲什麼複用的(reusable)方法應該被添加到構造方法的prototype屬性。prototype在很多程序猿看起來就像外星人一樣,那麼你可以將它隱藏在一個方法背後.

使用method()方法去定義一個類型,看起來可能就像下面一樣:
var Person = function (name) {
    this.name = name;
}.
    method('getName', function () {
        return this.name;
    }).
    method('setName', function (name) {
        this.name = name;
        return this;
    });
注意構造方法是如何鏈式調用方法method()的。
method()方法接受兩個參數:
  • 新方法的名字
  • 方法的實現
這個新方法被添加給Person“類”,實現僅僅是另外一個函數,並且在實現函數的中,this指向Person創建的對象,就像你期望的一樣。

接下來你可以使用Person()去創建一個新對象:
var a = new Person('Adam');
a.getName(); // 'Adam'
a.setName('Eve').getName(); // 'Eve'
再次注意鏈式模式的使用,因爲setName()返回this變的可能。

最後,看一下method()函數是如何實現的:
if (typeof Function.prototype.method !== "function") {
    Function.prototype.method = function (name, implementation) {
        this.prototype[name] = implementation;
        return this;
    };
}
在這個實現中,首先盡職的做了一些檢查,這個方法是否已經被實現了。
如果沒有,我們繼續將作爲參數傳遞implementation函數添加給構造方法prototype的屬性。
在這種情況下,this指向構造函數,構造函數的原型是可擴展的。





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章