es6
class
js提供的一个语法糖,用来更清晰的定义类,有constructor属性,constructor里边定义类的属性,constructor默认返回实例对象(即this),但也可以返回其他对象。
它的方法都挂在prototype上。
示例代码如下:
1 | constructor() { |
set、get关键字
在class内部可以使用set和get关键字,对某个属性设置存值函数和取值函数,示例代码:
1 | constructor(name,age) { |
静态方法和私有方法属性
有静态方法,没有私有属性和私有方法,但可以通过其他方式实现,比如symbol。
静态方法
有关键字static的方法不能被实例继承,而是通过类直接调用,这种方法就叫”静态方法“。(静态方法可以和非静态方法重名;如果静态方法中有this关键字,那么这个this代表的是类,而非类的实例)
私有属性
类本身的属性,而不是通过constructor挂载实例this上的属性,比如Super.props = 1.
目前有了提案:
- 可以直接加关键字static定义静态属性
- 实例属性可以不用必须写在constructor中了。
新增属性new.target
新增属性new.target,用在构造函数中,用来判断实例对象是否通过new关键字来创建的,还有一种方法判断就是this instanceof Person
对比es5
很多特性都和es5是一致的,但有些特性就不同:
1. 类的内部所有定义的方法都是不可枚举的。
2. 默认就是严格模式。在类或者模块内部,默认就是严格模式。
3. 必须使用new进行调用,否则会报错。
4. 没有变量提升。
原型相关API
- hasOwnProperty用来判断对象是否自身拥有某属性。
- getPrototypeOf方法可以用来判断类的继承关系;.proto属性的替代方法,获取对象的原型。
- Object.keys是遍历不到prototype的,它只遍历可枚举的自身属性。
- Object.getOwnPropertyNames返回对象所有可枚举不可枚举的属性和方法。
继承
es5和es6
es5原型链只有一条,即prototype;
es6原型链有两条,一条是类本身实现属性继承(这样就子类就可以继承父类的静态方法),相当于是es5中的call/apply,另一条才是prototype。
内部对象没有静态引用。
子类的this需要通过父类的constructor完成塑造,得到与父类同样的实例属性和方法,然后在对其进行加工,否则子类是得不到this对象的。
getPrototypeOf()
判断继承关系
super
既可以当函数使用也可以当对象使用。
super()调用父类构造函数;super.method()调用父类方法
作为函数代表的是父类的构造函数,内部this指向的是子类。只能用在子类的构造函数中。
super() = A.prototype.constructor.call(this)
作为对象,在普通方法中指向的是父类的原型对象(不能访问父类的,this指向子类实例),在静态方法中指向的是父类(this指向子类)。
使用地方
可以用在class中和对象属性为method()中。