ES6引入了Class类的概念,作为对象的模板,通过class关键字,可以定义类;基本上,ES6的class可以看作只是一个语法糖
constructor方法是类的默认方法,通过new命令生成对象实例时,自动调用该方法;一个类必须有contructor方法,如果没有显示定义,一个空的constructor方法会被默认添加
类的实例
与ES5一样,类的所有实例共享一个原型对象
可以通过实例的__proto__属性为类添加方法
可以通过Object.getProptotypeOf()方法来获取实例对象的原型,然后再来为原型添加方法或属性
取值函数getter和存值函数setter
-----静态方法
类相当于实例的原型,所有在类中定义的方法,都会被实例继承;如果在一个方法前,加上static关键字,就表示该方法不会被实例继承,而是直接通过类来调用,这就称为“静态方法”
如果静态方法包含this关键字,这个this指向的是类,而不是实例
----extends
Class可以通过extends关键字来实现继承
ES5的继承,实质上是先创造子类的实例对象this,然后再将父类的方法添加到this上面;
ES6的继承,实质上是先将父类实例对象的属性和方法,加到this上面,然后再用子类的构造函数修改this;在子类的构造函数中,只有调用super之后,才可以使用this关键字,否则会报错;这是因为子类实例的构建,基于父类实例,只有super方法才能调用父类实例
-----Object.getPrototypeOf()
可以用来从子类上获取父类,用来判断一个类是否继承了另一个类
----super关键字
super这个关键字,既可以当作函数使用,也可以当作对象使用
super作为函数调用时,代表父类的构造函数
super作为对象时,在普通方法中,指向父类的原型对象;在静态方法中,指向父类
由于对象总是继承其他对象的,所以可以在任意一个对象中,使用super关键字
----类的prototype属性和proto属性
在大多数浏览器的ES5实现之中,每一个对象都有__proto__属性,指向对应的构造函数的prototype属性;Class作为构造函数的语法糖,同时有prototype属性和__proto__属性,因此同时存在两条继承链
1.子类的__proto__属性,表示构造函数的继承,总是指向父类
2.子类prototype属性的__proto__属性,表示方法的继承,总是指向父类的prototype属性
----实例的proto属性
子类实例的__proto__属性的__proto__属性,指向父类实例的__proto__属性,即子类的原型的原型,是父类的原型
注意点:
1.严格模式 类和模块的内部,默认就是严格模式,所以不需要使用use strict指定运行模式
2.不存在提升 类不存在变量提升
3.name属性 由于本质上,ES6的类只是ES5的构造函数的一层包装,所以函数的许多特性都被Class继承,包括name属性;name属性总是返回紧跟在class关键字后面的类名
4.Generator方法 如果某个方法之前加上星号* 就表示该方法是一个Generator函数
5.this指向 类的方法内部如果含有this,它默认指向类的实例