什么是继承?

继承就是A对象通过继承B对象,就能直接拥有B对象的所有属性和方法

实现继承的几种方法

1、原型链继承

基本原理:将父类的实例赋值给子类的原型

现在子类Coder就继承了父类Staff的私有属性,getComName,子类自身上有个getInfo的私有属性,下面进行验证

源代码:

 // 父类
function Staff() {    
  this.company = '2demo';
  this.list = [];
}
// 父类的原型
Staff.prototype.getComName = function() {
return this.company;
};

// 子类
    function Coder(name, skill) {
      this.name = name;
      this.skill = skill;
    }

// 继承 Staff
    Coder.prototype = new Staff();

// 因为子类原型的指向已经变了,所以需要把子类原型的contructor指向子类本身
    Coder.prototype.constructor = Coder;

// 给子类原型添加属性
    Coder.prototype.getInfo = function() {
      return {
        name: this.name,
      skill: this.skill
      };
    };

    let coder1 = new Coder('jason', 'javascript');

    coder1.getInfo(); // {name: 'jason', skill: 'javascript'}
    coder1.getComName(); // '2demo'

缺点:

子类的实例可以访问到父类的私有属性并且可以对其进行更改,这样不够安全。

源代码:

let coder2 = new Coder('tom','Python')
let coder3 = new Coder("jarry","C++")
coder2.list//[]
coder2.list.push(233)//[233]
coder2.list.push(1)//[233,1]
coder2.list.push(1)//[233,1,1]
coder3.list//[233, 1, 1]

2、class extends 继承

ES6中有了类的概念,可以通过class声明一个类,然后通过extends关键字来实现继承关系。

源代码:

class Staff {
  constructor(name){
      this.name=name;
  }
  static slogan(){
      return "爱示范"
  }
}
class Coder extends Staff{
  constructor(name,skill){
      super(name);//调用父类的constructor(name)
      this.skill=skill;
  }
}
let coder1 = new Coder('jason','JavaScript')

undefined
console.log(coder1)

注意:

1、子类必须在constructor方法中调用super方法,否则新建实例时会因为子类没有自己的this对象而导致出错,子类的this对象是继承父类的this对象然后对其进行处理,如果不调用super方法,子类就获取不到this对象

2、由于上面这个原因,在子类的构造函数中必须要先调用super才能使用this 关键字,否则也会报错

子类的proto属性指向父类,所以子类可以继承父类的静态方法。

子类原型的proto总是指向父类的prototype属性