js 继承的6种方法和利弊

首先有个共同的父亲

function Animal(name) {
        this.name=name || 'Animal';
        this.sleep=function () {
            console.log(this.name+'正在睡觉');
        }
    }
Animal.prototype.eat=function (food) {
   console.log(this.name+'正在吃'+food)
}

1、原型链继承 真真

1)优点

  • 简单明了,容易实现
  • 实例是子类的实例,实际上也是父类的一个实例
  • 父类新增原型方法/原型属性,子类都能访问到

2)缺点

  • 所有子类的实例的原型都共享同一个超类实例的属性和方法
  • 无法实现多继承
    function Cat() {

    }
    Cat.prototype=new Animal();
    var cat=new Cat();
    console.log(cat.name)
    cat.sleep();
    cat.eat('fish');
    console.log(cat instanceof Animal);
    console.log(cat instanceof Cat);

2、构造继承 无法继承父亲的原型属性,可继承多个 假真

实现原理:让父类的构造函数成为子类的方法,然后调用该子类的方法,通过this关键字给所有的属性和方法赋值

1)优点

  • 简单明了,直接继承超类构造函数的属性和方法

2)缺点

  • 无法继承原型链上的属性和方法
    function Cat() {
        Animal.call(this);
    }
    var cat=new Cat();
    console.log(cat.name);
    cat.sleep();
    cat.eat('fish');//报错
    console.log(cat instanceof Animal);
    console.log(cat instanceof Cat);

3、实例继承 真假

  function Cat() {
        var animal=new Animal();
        return animal;
    }
    var cat=new Cat();
    console.log(cat.name);
    cat.sleep();
    cat.eat('fish');
    console.log(cat instanceof Animal);
    console.log(cat instanceof Cat);

4、拷贝继承 假真

    function Cat() {
        var animal=new Animal();
        for(let p in animal){
            Cat.prototype[p]=animal[p]
        }
    }
    var cat=new Cat();
    console.log(cat.name);
    cat.sleep();
    cat.eat('fish');
    console.log(cat instanceof Animal);
    console.log(cat instanceof Cat);

5、组合继承 真真

  function Cat() {
        Animal.call(this)
    }
    Cat.prototype=new Animal(); //此时 Cat.prototype 中的 constructor 被重写了,会导致 cat.constructor === Animal
    Cat.prototype.constructor = Cat //将 Cat 原型对象的 constructor 指针重新指向 Cat 本身
    var cat=new Cat();
    console.log(cat.name);
    cat.sleep();
    cat.eat('fish');
    console.log(cat instanceof Animal);
    console.log(cat instanceof Cat);

6、寄生组合继承 但是实现条件比较复杂 真真

    function Cat() {
        Animal.call(this)
    }
    (function () {
        var s=Animal;
        s.prototype=Animal.prototype;
        Cat.prototype=new s();
    })();
    var cat=new Cat();
    console.log(cat.name);
    cat.sleep();
    cat.eat('fish');
    console.log(cat instanceof Animal);
    console.log(cat instanceof Cat);

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值