这是我参与「第四届青训营 」笔记创作活动的第11天。
class
构造函数的语法糖,为js只能用构造函数创建实例作了补充
特性
- class的数据类型是一个函数
- class的原型的constructor指向class
class A{}
A.prototype.constructor===A//true
- 通过new关键字创建出的实例的constructor指向该class
class A{}
let a = new A()
a.constructor===A//true
- class内部的方法实际上都是定义在类的prototype上
class A{
fn(){}
run(){}
}
let a = new A()
console.log(a);
-
通过类创建对象的本质是调用类的constructor,如果类未定义constructor,则会在使用时默认添加
-
class不能直接调用,需要通过 new 关键字 class本质是一个函数,但是不能直接调用,而构造函数既可以通过new来创建实例,又可以作为函数直接调用。
-
class内部方法指向的是实例,class内部是严格模式。 严格模式下,调用一个函数,函数没有调用者的情况,this不再指向window,而是undefined(函数不会提升为全局window的方法)。
-
class中使用箭头函数定义的方法,存放在实例上,而不再是实例的原型上了。
- 构造函数与class的区别
- class不能直接调用,需要通过 new 关键字,class不能直接调用,需要通过 new 关键字
- class内部是严格模式。 严格模式下,调用一个函数,函数没有调用者的情况,this不再指向window,而是undefined(函数不会提升为全局window的方法)。
- class内部的方法实际上都是定义在类的prototype上,构造函数内部的方法并没有定义在原型上,只是定义在自身。
静态属性
class中静态属性和方法的this指向的是类,而不是实例 static定义,静态方法可以和普通方法重名
class的继承
- 类的继承通过extends关键字
class F{
money = '100w'
fn () {}
}
class S extends F{
// 隐式创建constructor 并调用super()
}
- 子类中的constructor必须调用super,否则就会报错
class F{
money = '100w'
fn () {}
}
class S extends F{
constructor(){
super() //触发,继承父类的实例
}
}
- 在继承时,属性会直接添加到子类的实例中,方法会保存在类的原型上