zoukankan      html  css  js  c++  java
  • 浅谈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;
                   
                    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

      寄生构造模式

      

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

      

  • 相关阅读:
    【BZOJ】【1412】【ZJOI2009】狼和羊的故事
    【POJ】【2987】Firing
    【BZOJ】【1324】王者之剑
    【POJ】【2125】Destroying the Graph
    bzoj4870: [Shoi2017]组合数问题(DP+矩阵乘法优化)
    bzoj3810: [Coci2015]Stanovi(记忆化搜索)
    bzoj2120: 数颜色(BIT套主席树+set/分块)
    bzoj2144: 跳跳棋(二分/倍增)
    bzoj4552: [Tjoi2016&Heoi2016]排序(二分+线段树)
    bzoj4773: 负环(倍增floyd)
  • 原文地址:https://www.cnblogs.com/djlxs/p/5102710.html
Copyright © 2011-2022 走看看