类Class
简化,简化,还是简化,简化代码量,简化操作。下面列举出简化的内容:方法定义语法、类定义语法。下面依次分开来讲:
方法定义语法
①添加函数属性:不再使用function方式添加方法,而是直接使用属性名作为函数名的方式来取代关键字function。
②添加生成器函数属性:在标准函数名的前面添加一个*即可。
③添加标准的访问器函数属性:通过get/set关键字直接在行内定义访问器,这种方式下的get方法不能接受参数,而set方法至少接受一个参数。
④添加预计算(computed)属性名:用[]包裹的属性就是预计算属性,可以使用symbol、调用函数、连接字符串等。
类定义语法
①通过constructor属性来指定属于JS版本的构造函数。
②通过static关键字,之前是通过prototype属性来向构造器添加属性,这样所有的对象都可以拥有新增的属性,这里可以通过static关键字来取代prototype的效果。
子类
这里ECMAScript6明确说了,其继承系统参考了JAVA语言,那么,按照JAVA语言的来讲继承的话,其关键字无非下面几个:extends、super,下面就说说这2个关键字在ES6中的使用细节。
extends
class Children extends Parent{}通俗来讲extends使得子类继承父类的static属性、static方法、实例属性、实例方法。(跟JAVA一样,这里其实没什么多讲的,主要是constructor方法的prototype属性需要多注意下,constructor方法控制着static方法)
super
跟JAVA一样,略过。
注意:一般情况下通过new调用构造函数时this对象即被创建。因此,在子类的构造函数中,调用super构造函数之前访问this会触发一个引用错误(ReferenceError)。
new.target
假如自定义了Collection下面有一个list子类,一个set子类,当new list/set时,JS需要知道list/set的父类Collection的constructor方法的prototype属性指向哪里,所以出现了这个新关键字new.target。
当new.target用在constructor方法时,其会通过super()方法把子类的new.target值传递给父类,因此list/set通过new.target把自己的class名称传递给了Collection。
new.target在任何函数中都是合法的,如果函数不是通过new 调用,new.target将被赋值为undefined。
注意:JavaScript没有实现类的多继承。