JavaScript之面向对象与原型笔记整理--------创建对象之原型(3)

6.动态原型模式

//可以将原型分装到构造函数里
function Box(name,age){
      this.name = name;
      this.age = age;
      this.family = ['哥哥','姐姐'];
      if(typeof this.run != 'function'){        //判断this.run是否存在,不加这句原型初始化会不止一次(实例化几次就初始化几次)
            Box.prototype.run = function(){
                  return this.name + this.age + this.family;
            }
      }
}
//原型的初始化,只要第一次初始化就可以了,没必要每次构造实例化的时候都初始化
var box1 = new Box('Lee',20);
var box2 = new Box('Luck',18);

当第一次调用构造函数时,run()方法发现不存在,然后初始化原型。当第二次调用,就不会初始化,并且第二次创建新对象,原型也不会初始化了。这样即得到了封装,又实现了原型方法共享,并且属性都保持独立。

注意:使用动态原型模式,要注意一点,不可以再使用字面量的方式重写原型,因为会切断实例和新原型之间的联系(之前讲过)。

以上总结了各种方式对象创建方法,如果这几种方式都不能满足需求(基本上都可以满足了)。可以使用一开始那种模式:寄生构造函数(工厂模式+构造函数模式)。

7.寄生构造函数

//寄生构造函数 = 工厂模式 + 构造函数
function
Box(name,age){ //使用构造函数名 var obj = new Object(); obj.name = name; obj.age = age; obj.run = function(){ return this.name + this.age; } return obj; } var box = new Box('Luck',18);

寄生构造函数,其实就是工厂模式+构造函数模式。这种模式比较通用,但不能确定对象关系,所以,在可以使用之前所说的模式时,不建议使用此模式。

在什么情况下使用寄生构造函数比较合适呢?假设要创建一个具有额外方法的引用类型。由于之前说明不建议直接String.prototype.addstring,可以通过寄生构造的方式添加。

8.稳妥构造函数

在一些安全的环境中,比如禁止使用this和new,这里的this是构造函数里不使用this,这里的new是在外部实例化构造函数时不适用new。这种创建法师叫做稳妥构造函数。

function Box(name,age){
      var obj = new Object();
      obj.run = function(){
            return name + age;   //直接打印参数即可
      }
      return obj
}

var box = Box('Lee',20);
console.log(box.run());     //Lee20

 

posted @ 2018-08-15 10:40  灭世的蜜糖  阅读(116)  评论(0编辑  收藏  举报