原型链继承

关键:子类构造函数的原型为父类构造函数的实例对象
缺点

  1. 子类构造函数无法向父类构造函数传参。
  2. 所有的子类实例共享着一个原型对象,一旦原型对象的属性发生改变,所有子类的实例对象都会收影响
  3. 如果要给子类的原型上添加方法,必须放在 Son.prototype = new Father()语句后面
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    function Father(name) {
     this.name = name
  }
   Father.prototype.showName = function () {
     console.log(this.name);
  }
   function Son(age) {
     this.age = 20
  }
   // 原型链继承,将子函数的原型绑定到父函数的实例上,子函数可以通过原型链查找到复函数的原型,实现继承
   Son.prototype = new Father()
   // 将Son原型的构造函数指回Son, 否则Son实例的constructor会指向Father
   Son.prototype.constructor = Son
   Son.prototype.showAge = function () {
     console.log(this.age);
  }
   let son = new Son(20, '刘逍') // 无法向父构造函数里传参
   // 子类构造函数的实例继承了父类构造函数原型的属性,所以可以访问到父类构造函数原型里的showName方法
   // 子类构造函数的实例继承了父类构造函数的属性,但是无法传参赋值,所以是this.name是undefined
   son.showName() // undefined
   son.showAge()  // 20