浅谈js的几种模式(三)

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

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

  前面讲到了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

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

  动态原型模式

  先来个例子

  

//动态原型模式
            function Person (name,job,age) {
                this.name=name;
                this.job=job;
                this.age=age;
                alert("进来了");
                if(typeof this.sayName !="function"){
            alert 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

  寄生构造模式

  

      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高级程序设计》。

  

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