Javascript面向對象編程 -- 設計模式

寫在前面:

以前的文章都是寫構造函數,原型之類的。可是咱們都知道原型最大的優勢也是缺點就是共享。也是咱們最頭疼的問題.
據共享的緣故,致使不少開發者放棄使用原型,由於每次實例化出的數據須要保留本身的特性,而不能共享。設計模式

組合構造函數+原型模式

解決構造傳參和共享問題,能夠組合構造函數+原型模式app

function Box(name, age) {         //不共享的使用構造函數
this.name = name;
this.age = age;
this.fruits = ['apple', 'banana', 'orange'];
};
Box.prototype = {                   //共享的使用原型模式
    constructor: Box,               //強制指向Box
    run: function() {
    return this.name + this.age + this.fruits;
        }
}

PS:這種模式也是最多見也是最經常使用的模式,這種混合模式很好的解決了傳參和引用共享的大難題。 是建立對象比較好的方法。函數

動態原型模式

原型模式, 無論你是否調用了原型中的共享方法, 它都會初始化原型中的方法, 而且在
聲明一個對象時, 構造函數+原型部分讓人感受又很怪異, 最好就是把構造函數和原型封裝
到一塊兒。爲了解決這個問題,咱們可使用動態原型模式ui

動態原型模式:this

function Box(name ,age) {                 //將全部信息封裝到函數體內
this.name = name;
this.age = age;
if (typeof this.run != 'function') {     //僅在第一次調用的初始化
Box.prototype.run= function() {
return this.name;
  };
 }
}
var box = newBox('Lee', 3);
alert(box.run())

第一次調用構造函數時, run()方法發現不存在,而後初始化原型。當第二次調用,就不會初始化, 而且第二次建立新對象, 原型也不會再初始化了。 這樣及獲得了封裝, 又實現了原型方法共享,而且屬性都保持獨立.prototype

注意:使用動態原型模式,千萬不能使用字面量的方式重寫原型,由於它會切斷實例與新原型之間的聯繫!!!設計

這是Javascript OOP裏面的其中兩種設計模式,下一篇文章會講寄生構造函數模式和穩妥構造函數模式。
還有最頭疼的繼承!code

相關文章
相關標籤/搜索