ES6-Class解析

1.实例和原型:
- ==实例属性现在除了可以定义在
constructor()
方法里面的this
上面,也可以定义在类内部的最顶层
。== - ==类的方法,是定义在原型上的;==
1 | class Point { |
2.getter和setter
与 ES5 一样,在“类”的内部可以使用get
和set
关键字,对某个属性设置存值函数和取值函数,拦截该属性的存取行为。
1 | class MyClass { |
3.静态方法和属性
3.1 方法
类相当于实例的原型,所有在类中定义的方法,都会被实例继承。
如果在一个方法前,加上static
关键字,就表示该方法==不会被实例继承==,而是直接通过==类来调用==,这就称为“静态方法”。
1 | class Foo { |
父类的静态方法,可以==被子类继承==。
1 | class Foo { |
3.2 属性
静态属性指的是 Class 本身的属性,即Class.propName
,而不是定义在实例对象(this
)上的属性。
1 | // 老写法 |
4.私有属性和方法
ES2022正式为class
添加了私有属性,方法是在属性名之前使用#
表示。
1 | class IncreasingCounter { |
私有属性,只能在类的内部使用(this.#count
)。如果在类的外部使用,就会报错。
5.this指向
类的方法内部如果含有this
,它==默认指向类的实例==。
但是,必须非常小心,一旦单独使用该方法,很可能报错。
1 | class Logger { |
上面代码中,如果将printName
方法提取出来单独使用,this
会指向该方法运行时所在的环境(由于 class 内部是严格模式,所以 this 实际指向的是undefined
),从而导致找不到print
方法而报错。
一个比较简单的解决方法是,在==构造方法中绑定this
==,这样就不会找不到print
方法了。
1 | class Logger { |
另一种解决方法是==使用箭头函数==。
1 | class Obj { |
箭头函数内部的this
总是指向定义时所在的对象。
上面代码中,箭头函数位于构造函数内部,它的定义生效的时候,是在构造函数执行的时候。这时,箭头函数所在的运行环境,肯定是实例对象,所以this
会总是指向实例对象。
- Post title: ES6-Class解析
- Create time: 2020-10-27 13:15:00
- Post link: 2020/10/27/Class/
- Copyright notice: All articles in this blog are licensed under BY-NC-SA unless stating additionally.
Comments