JavaScript中的几种继承方式

来源:互联网 发布:matlab输入未知数矩阵 编辑:程序博客网 时间:2024/05/18 03:09

JavaScript中的几种继承方式:

一:原型链
     让原型对象等于另一个类型的实例.此时,原型对象包含一个指向另一个原型的指针,相应地,另一个原型中也包含着指向另一个构造函数的指针.
     function  A(){
           this.prototype = true;
     }
     A.prototype.getAValue = function(){
           return  this.prototype; 
     }
      function  B(){
            this.Bprototype = false; 
      }
      //B继承A
      B.prototype = new A();
     
      var b = new B();
      alert(b.getAValue());   //true
      缺点: 
             1.包含引用类型值的原型属性会被所以实例共享.
             2.在创建子类型的实例时,不能向超类型的构造函数传递参数.

二:借用构造函数
     在子类型构造函数的内部调用超类型的构造函数
     function  A(name){
           this.color =["red"];
           this.name = name;
     }
     function B(){
           //B继承A
           A.call(this,"Tom");
     }
     var b = new B();
     alert(b.name);  // Tom
     b.color.push("blue");
     alert(b.color);  // red,blue
     
     var b2 = new B();
     alert(b.color);  // red
     优点:可以在子类型构造函数向超类型的构造函数传递参数.
     缺点:
           1.如果仅仅借用构造函数,那么将无法避免构造函数存在的问题:方法都在构造函数中定义,因此函数无法复用.
           2.在超类型中定义的函数,在子类中不可见,只能使用构造函数模式,因此,这种方式很少单独使用.

三:组合继承
     使用原形链实现对原型属性和方法的继承,通过借用构造函数实现对实例属性的继承,这是JavaScript中最常用的继承模式.
     缺点:调用两次超类型的构造函数

四:原型式继承
     在object()函数内部先创建一个临时性的构造函数,然后将传人的对象作为这个构造函数的原型,最后再返回这个临时类型的新实例
     function  object(o){
          function F(){}
          F.prototype = o;
          return new F();
    }
    缺点:包含引用类型值的属性始终都会共享相应的值,就像使用原型模式一样.
    在没必要创建构造函数,而只是想让一个对象和另一个对象保持类似的情况下,可以使用原型式继承.  

五:寄生式继承
     创建一个仅用于封装继承过程的函数,该函数在内部以某种方式来增强对象,最后再返回对象.
     function createAnother(o){
     var clone = object(o);
     clone.sayHi(){
         alert('hi');
     };
     return clone;
     }
     var Person = {
           name: "Tom"
     };
     var anotherPerson = createAnother(Perpso);
      anotherPerson.sayHi();  //"hi"
      缺点:使用寄生式继承来为对象添加函数,会由于不能做到函数复用而降低效率(与构造函数模式类似).

六:寄生组合式继承
     用借用构造函数来继承属性,通过原型链的混成形势来继承方法.
     思路:不必为了指定子类型的原型而调用超类型的构造函数,而所需要的无非就是超类型原型的一个副本而已.本质上就是,使用寄生式继承来继承超类型的原型,然后再将结果指                 定给子类型的原型.
    function inheritPrototype(B,A){
          var  prototype = object(A.prototype);   //创建对象
          prototype.constructor = B;                     //增强对象
          B.prototype = prototype;                        //指定对象
    }
    inheritPrototype()函数实现了寄生组合继承的最简单形式.
    优点:只调用一次超类型的构造函数



0 0
原创粉丝点击