class总结|青训营笔记

89 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的第11天。

class

构造函数的语法糖,为js只能用构造函数创建实例作了补充

特性

  1. class的数据类型是一个函数
  2. class的原型的constructor指向class
class A{}
A.prototype.constructor===A//true
  1. 通过new关键字创建出的实例的constructor指向该class
class A{}
let a = new A()
a.constructor===A//true
  1. class内部的方法实际上都是定义在类的prototype上
class A{
    fn(){}
    run(){}
}
let a = new A()
console.log(a);
  1. 通过类创建对象的本质是调用类的constructor,如果类未定义constructor,则会在使用时默认添加

  2. class不能直接调用,需要通过 new 关键字 class本质是一个函数,但是不能直接调用,而构造函数既可以通过new来创建实例,又可以作为函数直接调用。

  3. class内部方法指向的是实例,class内部是严格模式。 严格模式下,调用一个函数,函数没有调用者的情况,this不再指向window,而是undefined(函数不会提升为全局window的方法)。

  4. class中使用箭头函数定义的方法,存放在实例上,而不再是实例的原型上了。

  • 构造函数与class的区别
  1. class不能直接调用,需要通过 new 关键字,class不能直接调用,需要通过 new 关键字
  2. class内部是严格模式。 严格模式下,调用一个函数,函数没有调用者的情况,this不再指向window,而是undefined(函数不会提升为全局window的方法)。
  3. class内部的方法实际上都是定义在类的prototype上,构造函数内部的方法并没有定义在原型上,只是定义在自身。

静态属性

class中静态属性和方法的this指向的是类,而不是实例 static定义,静态方法可以和普通方法重名

class的继承

  1. 类的继承通过extends关键字
class F{
    money = '100w'
    fn () {}
}
class S extends F{
// 隐式创建constructor 并调用super()
}
  1. 子类中的constructor必须调用super,否则就会报错
class F{
    money = '100w'
    fn () {}
}
class S extends F{
    constructor(){
        super() //触发,继承父类的实例
    }
}
  1. 在继承时,属性会直接添加到子类的实例中,方法会保存在类的原型上