lishengzxc / bblog

My Blog
https://github.com/lishengzxc/bblog/issues
178 stars 8 forks source link

ES6 中 Class 的 super #3

Open lishengzxc opened 8 years ago

lishengzxc commented 8 years ago
class A { 
  constructor(a) {
    this.a = a
  }
}

class B extends A {
  constructor(a, b) {
    super(a)
    this.b = b
  }
}

var a = new A(a)
var b = new B(a, b)

在 ES6 中,这样的用法,我想已经总所周知了,但是super在使用的时候,我还需要知道一些它的其他特性。

在子类的构造函数中,只有调用super()之后,才可以使用this关键字

super同时还可以看作是一个对象,这个对象是父类(用 ES5 的概念说的话,是被构造调用的函数的原型)

所以我们还可以这样使用super

class A {
  foo() { 
    console.log(1)
  }
}

class B extends A {
  bar() {
    super.foo()
  }
}

var b = new B()
b.bar() // 1

这样我们就可以面向委托编程,至于什么是面向委托,可以参考《你不知道的 Javascript》

更新

(1)作为函数调用时(即super(...args)),super代表父类的构建函数。 (2)作为对象调用时(即super.propsuper.method()),super代表父类。注意,此时super即可以引用父类实例的属性和方法,也可以引用父类的静态方法。