ES6 class, extends, super(引用父类)
ES6提供了更接近传统语言的写法,引入了Class(类)这个概念,作为对象的模板。通过class关键字,可以定义类。基本上,ES6的class可以看作只是一个语法糖,它的绝大部分功能,ES5都可以做到,新的class写法只是让对象原型的写法更加清晰、更像面向对象编程的语法而已
新建一个Class 父类
class Animal { constructor(){ this.type = 'animal' } says(say){ console.log(this.type + ' says ' + say) } } let animal = new Animal() animal.says('hello')
输出结果
[Running] node "c:\web\single\test.js" animal says hello [Done] exited with code=0 in 0.193 seconds
新建一个子类 继承extends父类
class Cat extends Animal { constructor(){ super() this.type = 'cat' } } let cat = new Cat() cat.says('hello')
输出结果
[Running] node "c:\web\single\test.js" animal says hello cat says hello [Done] exited with code=0 in 0.195 seconds
上面代码首先用 class 定义了一个“类”,可以看到里面有一个 constructor 方法,这就是构造方法,而this关键字则代表实例对象。简单地说,constructor 内定义的方法和属性是实例对象自己的,而 constructor 外定义的方法和属性则是所有实力对象可以共享的。
Class之间可以通过extends关键字实现继承,这比ES5的通过修改原型链实现继承,要清晰和方便很多。上面定义了一个Cat类,该类通过extends关键字,继承了Animal类的所有属性和方法。
super关键字,它指代父类的实例(即父类的this对象)。子类必须在constructor方法中调用super方法,否则新建实例时会报错。这是因为子类没有自己的this对象,而是继承父类的this对象,然后对其进行加工。如果不调用super方法,子类就得不到this对象。
ES6 的继承机制,实质是先创造父类的实例对象this(所以必须先调用super方法),然后再用子类的构造函数修改this。