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