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

相关文章
相关标签/搜索