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。