ES6--class继承的实质

490 阅读1分钟
class A {
  state = {
    text: 'vin'
  }
  static staticState = {
    text: 'static'
  }
}
class B extends A {}

class继承的实质是:B的实例继承A的实例,B继承A:

//对应代码如下
Object.setPrototypeOf(B.prototype,A.prototype)
Object.setPrototypeOf(B,A)

该如何理解上面两行代码呢?为帮助理解而引申的问题:

  • 问题一:为何B的实例继承了A的实例?
    • 答:由于B.prototype就是B的实例的原型,所以,B的实例的原型的 原型是A.prototype。注意:如果一个对象的原型是A.prototype,那么这个对象就是A的实例。所以B的实例的原型是A的实例,所以就是B的实例继承了A的实例。
  • 问题二:B是如何取到A中的静态属性的?
    • 答:class继承经历了Object.setPrototypeOf(B,A),所以A是B的原型引用,所以处于A自身的属性可以被B取到;而static定义的属性和方法,恰好处于A自身,所以B能取到。