原型的几种继承模式和模拟底层完美继承机制

哈罗,我又来了,坚持学习,坚持更新,分享一下我昨天学习的视频内容叭,废话不多说,看下面代码

原型的几种继承模式


        // 1.原型继承(既继承了模板,也继承了原型对象)

        // 父类构造函数
        //   function Person(name,age){
        //        this.name=name;
        //        this.age=age;
        //   }
        // //   父类原型
        // Person.prototype={  //简单原型
        //     constructor:Person,//这句话必须添加
        //     sayName:function(){
        //          alert(this.name);
        //     },
        // };

        // // 子类构造函数
        // function Boy(sex){
        //         this.sex=sex;
        // }

        // // 原型继承
        // Boy.prototype=new Person('z3');//但是子类要调用父类的属性,必须要在父类里给实参
        // // 实例
        // var b=new Boy();
        // alert(b.name);  // (如果子类里又改属性,就从子类里调用,没有就向父类里中)
        //  b.sayName();

    //  2.类继承:只继承模板,不继承原型(也叫借用构造函数继承)
    
        // // 父类构造函数
        // function Person(name,age){
        //        this.name=name;
        //        this.age=age;
        //   }
        // //   父类原型
        // Person.prototype={  //简单原型
        //     constructor:Person,//这句话必须添加
        //     sayName:function(){
        //          alert(this.name);
        //     },
        // };

        // // 子类构造函数
        // function Boy(name,age,sex){  //所以这里没有父类的形式就要手动加上
        //     // call apply 可以把方法添加到子类里(把person当方法来看)
        //     // this指向调用者b,所以就通过call方法把Person模板添加到子类里
        //     Person.call(this,name,age);  //实现了 借用构造函数继承
        //         this.sex=sex;
        // }

        // var b=new Boy('z3',23,'男');
        // alert(b.name)
        // alert(b.sex);
        // b.sayName();//因为没有继承原型,所以不能调用sayName()方法



    //  3.混合继承=原型继承+借用构造函数继承
     // 父类构造函数
     function Person(name,age){
               this.name=name;
               this.age=age;
          }
        //   父类原型
        Person.prototype={  //简单原型
            constructor:Person,//这句话必须添加
            sayName:function(){
                 alert(this.name);
            },
        };

        // 子类构造函数  1.借用构造函数继承
        function Boy(name,age,sex){  //所以这里没有父类的形式就要手动加上
            // call apply 可以把方法添加到子类里(把person当方法来看)
            // this指向调用者b,所以就通过call方法把Person模板添加到子类里
            Person.call(this,name,age);  //实现了 借用构造函数继承
                this.sex=sex;
        }
       
    //    2.原型继承
     Boy.prototype=new Person();

 //   这样就实现了混合继承(可以在子类给实参,继承了模板,也继承了原型)
     var b=new Boy('z3',24,'男');
     alert(b.name);
     b.sayName();  //可以调用原型里的方法

模拟底层完美继承机制

//按我标记的顺序来看代码

  **== 一.这里是第三步 ==**
    // 模拟extjs底层继承机制
    //   完美的继承 (两个参数:子类,父类)
    function extend(sub,sup){
        // 目的 :实现只继承原型
        // 1.创建一个空函数来 进行中转
        var F=Function ();  //因为是空函数,没有模板
        F.prototype=sup.prototype;//2.实现了空函数和父类的原型转换
        sub.prototype=new F ();//3.原型继承  实现了只继承原型(这里sub的构造器是F)
        sub.prototype.constructor=sub;//4.还原构造器
        // 保存父类的原型:一方面方便解耦,另一方面为了方便获得父类的原型对象
        sub.superClass=sup.prototype;   //自定义一个子类的静态属性
        //判断父类的原型构造器(加保险)
        if(sup.prototype.constructor == Object.prototype.constructor){
            sup.prototype.constructor=sup;
        }

    }

      **== 一.这里是第一步 ==**
      //  混合继承=原型继承+借用构造函数继承
     // 父类构造函数
     function Person(name,age){
               this.name=name;
               this.age=age;
          }
        //   父类原型
        Person.prototype={  //简单原型
            constructor:Person,//这句话必须添加 (没有加的话,上面加了保险)
            sayName:function(){
                 alert(this.name);
            },
        };

        // 子类构造函数  1.借用构造函数继承
        function Boy(name,age,sex){  //所以这里没有父类的形式就要手动加上
            // call apply 可以把方法添加到子类里(把person当方法来看)
            // this指向调用者b,所以就通过call方法把Person模板添加到子类里
            // Person.call(this,name,age);  //实现了 借用构造函数继承
              **== 一.下面这一句是第四步 ==**
            Boy.superClass.constructor.call(this,name,age);//这样写就不会出现父类的代码了
                this.sex=sex;
        }
            
    //    2.原型继承
    //  Boy.prototype=new Person();
    // 调用extend方法  只继承原型
    extend(Boy,Person);
     // 如果给子类的原型里添加一个sayName();方法,就会覆盖父类的sayName();方法
     Boy.prototype.sayName=function(){
            alert('hello word!');
        }    **== 一.这个方法是第五步 ==**

 //   这样就实现了混合继承(可以在子类给实参,继承了模板,也继承了原型)
     var b=new Boy('z3',24,'男');
     alert(b.name);
    //  b.sayName();  //可以调用原型里的方法

    // 如果非调用父类的sayName();方法,可以通过以下代码来实现   **== 一.这里是第六步 ==**
    Boy.superClass.sayName.call(b);//直接在父类的原型里找到sayName();方法,然后执行一下

  **== 一.这里是第二步 ==**
    //  所以混合继承:继承了两次模板,一次原型(代码多时,效率低)

    // 那么现在我们要只继承一次模板,一次原型
     //    2.原型继承  就是要改变这里。使这里只继承原型
    //  Boy.prototype=new Person();
    // 所以可以自定义一个extend方法来实现

好了,今天就到这了,有什么问题可以问我,有什么建议也可以提出来哈

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值