zoukankan      html  css  js  c++  java
  • ECMAScript面向对象(三)——之继承

    1.原型链方式

    主要利用原型对象,让引用类型A的的prototype属性指向另一个引用类型的实例,从而继承另一个引用类型的属性和方法。

    问题
    1.无法在创建子类的时候向父类的构造函数传递参数
    2.父类中有引用类型的属性的话,只要子类实例中有操作,所有的都会受到影响

     function Annimal(c){
         this.annimalClass=c;
         this.eat=function(){
             console.log('eatting.....');
         };
       this.runing=function(){
           console.log('runing.............');
       };
     }
    
    // sub
    function Felidae(ftype){
        this.Ftype=ftype;
    }
    
    // 先继承
    Felidae.prototype=new Annimal("Felidae");
    
    // 再添加或重写父类的方法
    Felidae.prototype.like=function(h){
        console.log(h);
    }
    
    // 使用
    
    var cat=new Felidae("cat");
    
    // 从父类继承了runing方法
    cat.runing();  

      2.借用构造函数

    利用函数的父函数call方法实现继承。

    问题:
    1.子类可以继承父类在构造函数中定义的属性和方法,但是方法无法复用 2.但是父类在原型中定义的属性和方法对子类是不可见的
    // 借用构造函数
    function SuperType(){
        this.arr=[1,2,3];
    }
    
    SuperType.prototype.show=function(){
        console.log(this.arr);
    }
    
    function SubType(){
        SuperType.call(this);
    }
    
     var sub1=new SubType();
     sub1.arr.pop();
     console.log(sub1.arr);//[1,2]
     var sub2=new SubType();
      sub2.arr.push(20);
     console.log(sub2.arr);//[1,2,3,20]
    
     // 子类可以继承父类在构造函数中定义的属性和方法
     // 但是父类在原型中定义的属性和方法对子类是不可见的
     sub1.show();//sub1.show is not a function
    
     var sup1=new SuperType();
     sup1.show();//[1,2,3]

    3.组合继承(原型链+构造)

    function SuperType(fname){
        this.fileName=fname;
        this.arr=[1,2,3];
    }
    
    SuperType.prototype.show=function(){
        console.log(this.arr);
    }
    
    // 继承
    function SubType(fname,size){
        SuperType.call(this,fname);//构造函数
        this.size=size;
    }
    
    // 原型继承
    SubType.prototype = new SuperType();
    SubType.prototype.constructor=SubType;
    //添加新方法
    SubType.prototype.showF=function(){
     console.log("name:"+this.fileName+"
    "+"size:"+this.size+"kb");
    };
    
    var sub1=new SubType("todo.txt",512);
       sub1.show();
       sub1.showF();
    
      console.log(sub1 instanceof SubType);//true
      console.log(sub1 instanceof SuperType);//true
      console.log(sub1 instanceof Object);//true

    4.原型式继承

    使用一个已存在的实例对象作为,子类的原型对象。

    // 原型式继承
    // 用于在一个已有的对象实例上拓展新的方法
     function object(o){
        function F(){}
         F.prototype=o;
         F.prototype.show=function(){
             for ( var agr in o){
                 console.log(agr);
             }
         }
         return new F();
     }
     var p={
         arr:[1,2,3],
         name:"done"
     }
    
    var p1=object(p);
     p1.show();
    
     var p2=object(p);
     p2.arr.pop();
     console.log(p2.arr);
     console.log(p1.arr);

    5.寄生继承

    // 寄生式继承
     function createAn(o){
    
         var onew = object(o);//沿用上面的原型式继承的object函数
         onew.show1=function(){//添加自己的方法
             console.log("show1......");
         };
    
         return onew;
     }
    
    var a1=createAn(p);
        a1.show1();

    6.寄生组合继承(寄生+构造+原型链)

    使用寄生式继承来继承超类的原型,然后将结果指定给子类的原型。

    // 寄生组合式继承
    //与原型构造组合类似,知识这里使用了一个寄生函数来实现原型链继承
    //
    // 用寄生的方式将【原型构造组合】下面的包装起来,使用的时候用下面的函数替换掉组合继承里面的代码即可
    // SubType.prototype = new SuperType();
    // SubType.prototype.constructor=SubType;
    
     inheritProto(SubType,SuperType)
     {
          var proto=object(SuperType.prototype);//用父类的原型创建一个新的对象
           proto.prototype.constructor=SubType;
           SubType.prototype=proto;
     }
  • 相关阅读:
    HTML_项目符号使用图片
    字符串查找和替换接口
    AOP代理分析
    3星|董藩《房地产的逻辑》:应该鼓励开发商多盖房而不是惩罚开发商
    2.5星|郎咸平《拯救世界的经济学》:各发达国家与中国的福利政策、经济干预政策的前世今生
    3.5星|科特勒《营销革命4.0》:打造无缝衔接的线上和线下体验
    3星|《韩国式资本主义》:财阀祸害韩国,韩国需要正义的资本主义
    4星|《特朗普时代的全球化战略》:管理学界和管理者可能严重低估了核心管理实践的价值
    2星|《内容创业》:知识付费行业的公开资料整理汇编
    3星|《身边的博弈》:10年旧书,博弈论科普和习题讲解
  • 原文地址:https://www.cnblogs.com/fanglylu/p/6824564.html
Copyright © 2011-2022 走看看