浅谈js的几种模式(三)

接着前面两篇,终于到了第三篇了,天真热。

1 组合使用构造函数模式和原型模式

前面讲到了js中的原型模式,是为了解决不共享的问题,然而也因为原型模式的共享性带来了一些问题。原型中所有的属性,对它的实例都是共享的,但是有时我们希望每个实例中能有自己私有的属性,那么此时我们就要组合使用构造函数模式和原型模式。例:

function Person (sex) { 
  this.sex=sex; 
} 
Person.prototype.name="DJL"; 
Person.prototype.job="student"; 
var person1=new Person("男"); 
var person2=new Person("女"); 
alert(person1.sex);//男 
alert(person1.job);//student 
alert(person2.sex);//女  
alert(person2.job);//student

这种组合方式,是目前使用最广的一种创建自定义类型的方法。

2 动态原型模式

先来个例子:

  //动态原型模式 
  function Person (name,job,age) { 
    this.name=name; 
    this.job=job; 
    this.age=age; 
    alert("进来了"); 
    if(typeof this.sayName !="function"){
      Person.prototype.sayName=function(){ 
        alert(this.name); } 
      } 
  }
  var person1=new Person("djl","student",22);        
  var person2=new Person("DJL","student",22);
  person1.sayName();  //djl
  person2.sayName();  //DJL

在这里如果sayName不存在,则会在原型中添加。我们可以看到在执行person1.sayName();时进入了if条件语句,而在执行person2.sayName();并没有进入。这就避免了在创建很多实例对象时反复去添加同一个原型属性。这里对原型所做的修改,能够立即在所有对象实例中得到反映。对于这种模式创建的对象,还可以使用instanceof 判断其具体类型。

alert(person1 instanceof Person);//true
3 寄生构造模式 
function Person () { 
     var o=new Object(); 
     o.name="djl"; 
     o.age=22; 
     o.job="student"; 
     o.sayName=function(){ 
        alert(this.name); 
    } return o; 
}

首先,返回的这个对象与构造函数或者与构造函数的原型都没有什么关系,所以不能依赖instanceof 来检测其具体类型。和工厂模式有一样的问题。
  好了就写这么多了,我能写的也只有这么多了。感觉就是在解决如何实现属性共享和解决属性共享带来的问题,即对象属性有时要做到共享,有时要做到独立,有时两者都要兼备啊!
  欢迎大家继续交流,如果有更多见解,不要不告诉我哦!最后还是向大家推荐一下这本书《JavaScript高级程序设计》。

DJL箫氏:一个狂热的前端爱好者,性别男,爱好女,目前实习于创维集团


上一篇 浅谈js的几种模式(二)

你可能感兴趣的:(浅谈js的几种模式(三))