javascript設計模式介紹(五)動態原型模式

有其他 OO語言經驗的開發人員在看到獨立的構造函數和原型時,很可能會感到非常困惑。

動態原型模式正是致力於解決這個問題的一個方案,它把所有信息都封裝在了構造函數中,而通過在構造函數中初始化原型(僅在必要的情況下),又保持了同時使用構造函數和原型的優點。

換句話說,可以通過檢查某個應該存在的方法是否有效,來決定是否需要初始化原型。

來看一個例子。

function Person(name, age, job){
        //屬性
        this.name= name;
        this.age= age;
        this.job= job;
        //方法
        if(typeof this.sayName != "function"){
                 Person.prototype.sayName= function(){
                           alert(this.name);
                 };
        }
}
 
var friend = new Person("Nicholas", 29, "Software Engineer");
friend.sayName();


這裏只在 sayName()方法不存在的情況下,纔會將它添加到原型中。

這段代碼只會在初次調用構造函數時纔會執行。此後,原型已經完成初始化,不需要再做什麼修改了。

不過要記住,這裏對原型所做的修改,能夠立即在所有實例中得到反映。因此,這種方法確實可以說非常完美。

其中,if 語句檢查的可以是初始化之後應該存在的任何屬性或方法——不必用一大堆if 語句檢查每個屬性和每個方法;只要檢查其中一個即可。

對於採用這種模式創建的對象,還可以使用 instanceof 操作符確定它的類型。

使用動態原型模式時,不能使用對象字面量重寫原型。前面已經解釋過了,如果在已經創建了實例的情況下重寫原型,那麼就會切斷現有實例與新原型之間的聯繫

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