类声明
class PersonClass {
constructor(name) {
this.name = name
}
sayName() {
console.log(this.name)
}
}
let person = new PersonClass('one')
person.sayName() // one
console.log(person instanceof PersonClass) // true
console.log(typeof PersonClass) // function
console.log(typeof PersonClass.prototype.sayName) // function
类声明只是基于已有自定义类型声明的语法糖。虽然类与自定义类型之间有诸多相似之处,但是仍有以下差异:
- 函数声明可以被提升,而类与let声明类似,不能被提升;真正执行声明语句之前,他们会一直存在于临时死区中;
- 类声明中的所有代码将自动运行在严格模式下,而且无法强制让带吗脱离严格模式执行;
- 在自定义类型中,需要通过
Object.defineProperty()
方法手动指定某个方法为不可枚举;而在类中,所有方法都是不可枚举的; - 每个类都有一个名为[[Construct]]的内部方法,通过关键字new调用那些不含[[Construct]]的方法会导致程序抛出错误;
- 使用除关键字new以外的方式调用类的构造函数会导致程序抛出错误;
- 在类中修改类名会导致程序报错。
类表达式
类和函数都有两种存在形式:声明形式和表达式形式。
let PersonClass = class {
constructor(name) {
this.name = name
}
sayName() {
console.log(this.name)
}
}