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指向構造函數,構造函數的原型是可擴展的。