es6 class类的理解

es6:

类声明以 class 关键字开始,其后是类的名称;剩余部分的语法看起来就像对象字面量中的 方法简写,并且在方法之间不需要使用逗号。

类和自定义函数的区别:(有两种定义方式,表达式和声明)

1.class没有变量提升。

2.类声明会自动运行在严格模式下,并且也无法退出严格模式。

3.类的所有方法都是不可枚举的(enumerable=false)。

4.调用类时不使用new运算符会报错。(因为在类的内部对于new.target属性进行了判断)

5.试图在类的方法内部修改类名会报错,但是外部代码可以修改,不能修改的原因是因为类名使用let(外部)/const(内部)来定义的。

let PersonClass = class PersonClass2 {

当我们用这种方法声明一个类时,PersonClass2的值为undefined

你能在类中的任何方法与访问器属性上使用 static 关键字, 唯一限制是不能将它用于 constructor 方法的定义。

静态成员不能用实例来访问,你始终需要直接用类自身来访问它们。

使用 super() 时需牢记以下几点:

1. 你只能在派生类中使用 super() 。若尝试在非派生的类(即:没有使用 extends 关键字的类)或函数中使用它,就会抛出错误。

2. 在构造器中,你必须在访问 this 之前调用 super() 。由于 super() 负责初始化 this ,因此试图先访问 this 自然就会造成错误。

3. 唯一能避免调用 super() 的办法,是从类构造器中返回一个对象。???

你总是可以使用 super.getArea() 方法来调用 基类中的同名方法。

关于super:

super作为函数调用时,代表父类的构造函数

子类的构造函数必须执行一次super函数

console.log(super())是返回的是子类构造函数:

原因:

super虽然代表了父类A的构造函数,但是返回的是子类B的实例,即super内部的this指的是B,因此super()在这里相当于A.prototype.constructor.call(this)。

new.target指向当前正在执行的函数

super作为对象使用时:

在普通方法中,指向父类的原型对象;在静态方法中,指向父类。

由于绑定子类的this,所以如果通过super对某个属性赋值,这时super就是this,赋值的属性会变成子类实例的属性。

猜你喜欢

转载自blog.csdn.net/hahahahahahahaha__1/article/details/81585482