继承

来源:互联网 发布:office软件安装失败 编辑:程序博客网 时间:2024/05/16 18:14

继承  :  

      接口继承:继承方法签名
      实现继承:继承实际方法

js中函数没有签名,所以使用的是实现继承-------依靠原型链实现

==================================================================

js继承:
      让一个引用类型 继承 另一个引用类型的属性和方法

==================================================================

原型链:

    //构造A
    function A(){
       this.name="loo";
    }
    A.prototype.aSay=function(){
       alert(this.name);
    }
  //构造B 
    function B() {
    this.age=23;
    }
    //将B作为A的实例,继承A的原型;
    B.prototype=new A();
    //给A的实例B添加自己的方法
    B.prototype.bSay = function() {
    alert(this.age);
    };
    //实例化B;
    var instance=new B();
    alert(instance.age); //23
    alert(instance.name); //loo
    instance.bSay();     //23
    instance.aSay();     //loo*/
    
    /*原型链: B的实例instance的[[prototype]]属性——————指向A的实例B,
     *               A的实例B的[[prototype]]属性——————指向Object的实例A,
     *               Object的实例A的[[prototype]]属性————指向Object。
     *实例instance的属性和方法的查找沿着原型链向上查找。
     *原型链存在的问题:
     *1.不能传递参数;
     *2.使用原型链实现继承时,不能使用对象字面量创建原型方法,因为这样会重写原型链。切记切记切记。
     *3.构造函数A中的引用类型值的实例属性被继承后变成了B的原型属性
     *  这样会导致B的实例中的引用类型值的属性被共享。比如:
    function A() {
           this.choose=["1","2","3"];
     }
     function B() {
     }
     B.prototype=new A();
     var instance1=new B();
     var instance2=new B();
     alert(instance1.choose); //1,2,3
     alert(instance2.choose); //1,2,3
     instance1.choose.push(4);
     alert(instance1.choose);//1,2,3,4
     alert(instance2.choose);//1,2,3,4
     instance1实例对引用类型值的操作影响了原型B继而影响到了instance2。
     */




=================================================

借用构造函数

 借用构造函数可以解决原型链中引用类型值的问题,并且可以为原型传入参数;
 缺点是方法定义在构造函数上了。
  function A(name) {
      this.choose=["1","2","3"];
      this.name=name;
     }
     function B(name) {
      //内部调用,既继承A有可传递参数;
      A.call(this,name);
      //继承后添加B的属性,即构造函数的实例属性
      this.age=23;
     }
     //实例化
     var instance1=new B("loo");
     var instance2=new B("ho");
     alert(instance1.choose);//1,2,3
     alert(instance2.choose);//1,2,3
     instance1.choose.push("4");
     alert(instance1.choose); //1,2,3,4
     alert(instance2.choose); //1,2,3  instance2未被影响
     alert(instance1.name);  //loo
     alert(instance2.name);  //ho
     alert(instance1.age);   //23
====================================

组合继承:组合原型链与借用构造函数

       思路:利用原型链来继承原型属性和方法,利用借构函数实现实例属性的继承
       例:
     //组合继承(常用继承模式)
     function A(name) {
      this.name=name;
      this.choose=["1","2","3"];
     }
    A
     A.prototype.sayName=function () {
      alert(this.name);
     }
     //继承
     function B(name,age) {
      //继承属性
      A.call(this,name);
      //定义实例属性
      this.age=age;
     }
     //继承方法
     B.prototype=new A();
     //定义B的方法
     B.prototype.sayAge=function () {
      alert(this.age);
     }
     //实例化
     var instance1=new B("loo",24);
     var instance2=new B("ho",23);


     alert(instance1.choose);//1,2,3
     alert(instance2.choose);//1,2,3
     //改版instance1中的数组
     instance1.choose.push("4");
     alert(instance1.choose);//1,2,3,4
     alert(instance2.choose);//1,2,3  instance2数组未被影响
     //调用方法
     instance1.sayName();//loo
     instance2.sayName();//ho
     //查看两个实例调用的方法是否相等
     alert(instance1.sayName==instance2.sayName);  //true 


   即组合继承可以传递参数,可以继承实例属性,原型属性,方法;
   所有实例可以共享方法。
0 0
原创粉丝点击