es5继承(原型链继承、拷贝式继承、寄生式继承)

es5继承

原型链继承:让子类的原型等于父类的原型
//woker 子类 person 父类
( Worker.prototype=Person.prototype;)
原型链继承有浅拷贝的问题,比如:
Worker.prototype.FnJob=function(){
return this.job;
}
给子类的原型添加方法时,父类的原型也会有这个子类添加的方法

        function Person(name,age){ // es5;
            this.name=name;
            this.age=age;
        }  // 定义是一个类 同时他也是构造函数
       
        Person.prototype.FnName=function(){ // 通过原型给类加上方法
            return this.name;
        }
        Person.prototype.FnAge=function(){
            return this.age;
        }

       
        function Worker(name,age,job){
            Person.call(this,name,age,job);  // 通过函数的标准调用
            this.job=job;
        }
        const W1=new Worker('李四',18,'搬砖');

        Worker.prototype=Person.prototype;
        
        Worker.prototype.FnJob=function(){
            return this.job;
        }

拷贝式继承
将父的原型重新定义为一个json,for in 循环这个json,让json里面的每一项都赋值给子类的原型,这样的话 给子类的原型添加方法时就不会有浅拷贝的问题

        function Person(name,age){ // es5;
            this.name=name;
            this.age=age;
        }  // 定义是一个类 同时他也是构造函数
       
        Person.prototype.FnName=function(){ // 通过原型给类加上方法
            return this.name;
        }
        Person.prototype.FnAge=function(){
            return this.age;
        }

       
        function Worker(name,age,job){
            Person.call(this,name,age,job);  // 通过函数的标准调用
            this.job=job;
        }
        const W1=new Worker('李四',18,'搬砖');
        const json=Person.prototype;
        //拷贝式继承
        for(var name in json){
            Worker.prototype[name]=json[name]
        }
        
        Worker.prototype.FnJob=function(){
            return this.job;
        }

寄生式继承
让子类的原型等于父类的一个实例(Worker.prototype=new Person()),然后让子类的原型的constructor等于子类(Worker.prototype.constructor=Worker)
这就是寄生式继承

        function Person(name,age){ // es5;
            this.name=name;
            this.age=age;
        }  // 定义是一个类 同时他也是构造函数
       
        Person.prototype.FnName=function(){ // 通过原型给类加上方法
            return this.name;
        }
        Person.prototype.FnAge=function(){
            return this.age;
        }

       
        function Worker(name,age,job){
            Person.call(this,name,age,job);  // 通过函数的标准调用
            this.job=job;
        }
        // 寄生式继承
        Worker.prototype=new Person();
        // 设置子类的构造函数时自身的构造函数,以防止因为设置原型而覆盖构造函数
        Worker.prototype.constructor=Worker;
        Worker.prototype.FnJob=function(){
            return this.job;
        }

        const W1=new Worker('李四',18,'搬砖');

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值