主题
class 不仅仅是语法糖
常说 class 是一个语法糖,因为我们实际上可以在不使用 class 的情况下声明相同的内容。
例如,使用纯函数重写 class User:
js
// 1. 创建构造器函数
function User(name) {
this.name = name
}
// 函数的原型(prototype)默认具有 "constructor" 属性,
// 所以,我们不需要创建它
// 2. 将方法添加到原型
User.prototype.sayHi = function () {
alert(this.name)
}
// 用法:
let user = new User('John')
user.sayHi()
这个定义的结果与使用类得到的结果基本相同,但是仍然存在着重大差异:
通过 class 创建的函数具有特殊的内部属性标记
[[IsClassConstructor]]: true
。例如,与普通函数不同,必须使用 new 来调用它:
jsclass User { constructor() {} } alert(typeof User) // function User() // Error: Class constructor User cannot be invoked without 'new'
此外,大多数 JavaScript 引擎中的类构造器的字符串表示形式都以 “class…” 开头:
jsclass User { constructor() {} } alert(User) // class User { ... }
类方法不可枚举。
类定义将
"prototype"
中的所有方法的enumerable
标志设置为false
。类总是使用
use strict
。在类构造中的所有代码都将自动进入严格模式。