背景:

  JavaScript的继承基本上可以分为两大类,一类是使用class定义的类使用extends继承;另一类是使用function定义的类基于原型链的继承。之前自己看过一遍JavaScript高级程序设计,但是今天在第二遍快速过的时候发现了两个之前自己没有注意的点。

需要注意点:

  1. 给原型添加新的方法的时候一定需要注意覆盖的问题。

 1 function SuperType() {
 2     this.property = true
 3 }
 4 SuperType.prototype.getSuperValue = function () {
 5     return this.property
 6 }
 7 function ASubType() {
 8     this.subproperty = false
 9 }
10 ASubType.prototype = new SuperType()
11 ASubType.prototype = {
12     getASubValue: function () {
13         return this.subproperty
14     },
15     someOtherMethod: function () {
16         return false
17     }
18 }
19 let a = new ASubType()
20 // TypeError: a.getSuperValue is not a function
21 console.log(a.getSuperValue())

  理解:

    ①. 其实这个就可以理解为覆盖(和函数的覆盖相似)

 

  2. 给原型添加方法的代码一定要放在替换原型语句之后。

 1 function SuperType() {
 2     this.property = true
 3 }
 4 SuperType.prototype.getSuperValue = function () {
 5     return this.property
 6 }
 7 function ASubType() {
 8     this.subproperty = false
 9 }
10 ASubType.prototype.getSubValue = function() {
11     return this.subproperty
12 }
13 
14 ASubType.prototype = new SuperType()
15 
16 ASubType.prototype.getSuperValue = function () {
17     return false
18 }
19 let a = new ASubType()
20 // TypeError: a.getSubValue is not a function
21 console.log(a.getSubValue())

  理解:

    ①. 在上述代码第10行,给ASubType添加原型方法时,添加的方法处于一个空位置原型中(这里的空位置指的是没有显示原型对象)。

    ②. 在第14行重新定义原型对象的时候,将ASubType的原型方法定义为SuperType,此时SuperType替代了那个空位置,所以自然第10添加的原型对象就无意义了

 

参考资料:

  1. 《JavaScript高级程序设计(第三版)》第六章165页