js继承

function Animal(name){
  this.name = name || 'Animal',
  this.sleep = function(){
    console.log(this.name + "is sleeping!");
  }
}
Animal.prototype.eat = function(food) {
  console.log(this.name + "is eatting" + "food")
}
  • 原型链继承

    function Car() {}
    Cat.prototype = new Animal();
    Cat.prototype.name = 'cat';
    // Test Code
    var cat = new Cat();
    console.log(cat.name);
    console.log(cat.eat('fish'));
    console.log(cat.sleep());
    console.log(cat instanceof Animal); //true
    console.log(cat instanceof Cat); //true
    
    • 介绍:在这里我们可以看到new了一个空对象,这个空对象指向Animal并且Cat.prototype指向了这个空对象,这种就是基于原型链的继承。
    • 特点:基于原型链,既是父类的实例,也是子类的实例
    • 缺点:无法实现多继承,当一个实例改变了其从原型那里继承来的引用属性值时,其它继承自这个原型属性的值都将被改变。
  • 构造继承:使用父类的构造函数来增强子类实例,等于是复制父类的实例属性给子类(没用到原型)

    function Cat(name){
      Animal.call(this);
      this.name = name || 'Tom';
    }
    // Test Code
    var cat = new Cat();
    console.log(cat.name);
    console.log(cat.sleep());
    console.log(cat instanceof Animal); // false
    console.log(cat instanceof Cat); // true
    
    • 特点:可以实现多继承
    • 缺点:只能继承父类实例的属性和方法,不能继承原型上的属性和方法。
  • 组合继承:相当于构造继承和原型链继承的组合体。通过调用父类构造,继承父类的属性并保留传参的优点,然后通过将父类实例作为子类原型,实现函数复用

    function Cat(name){
      Animal.call(this);
      this.name = name || 'Tom';
    }
    Cat.prototype = new Animal();
    Cat.prototype.constructor = Cat;
    // Test Code
    var cat = new Cat();
    console.log(cat.name);
    console.log(cat.sleep());
    console.log(cat instanceof Animal); // true
    console.log(cat instanceof Cat); // true
    
    • 特点:可以继承实例属性/方法,也可以继承原型属性/方法
    • 缺点:调用了两次父类构造函数,生成了两份实例
  • 寄生组合继承:通过寄生方式,砍掉父类的实例属性,这样,在调用两次父类的构造的时候,就不会初始化两次实例方法/属性

    function inheritPrototype(subType,superType){
      var prototype = Object.create(superType.prototype);//创建对象
      prototype.constructor = subType;
      subType.prototype = prototype;
    }
    inheritPrototype(Cat,Animal);
    

    Object.create()代码说明:

    function Object.create(o){
      function F() {};
      F.prototype = o;
      return new F();
    }
    
  • es5中的继承

    使用extends实现继承的时候,还是有几点需要注意的问题,子类在继承父类的时候,子类必须在constructor方法中调用super方法,否则新建实例时会报错,这是因为子类自己的this对象,必须先通过父类的构造函数完成塑造,得到与父类同样的实例属性和方法,然后再对其进行加工,加上子类自己的实例属性和方法,如果不调用super方法,子类就得不到this对象。

    class Point {  
      constructor(x,  y) {    
        this.x = x;    
        this.y = y;  
      }
    }
    class ColorPoint extends Point {  
      constructor(x,  y,  color) {    
        this.color = color; // ReferenceError    
        super(x, y);    
        this.color = color; // 正确  
      }
    }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值