构造函数继承

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

  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