Skip to content

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()

这个定义的结果与使用类得到的结果基本相同,但是仍然存在着重大差异:

  1. 通过 class 创建的函数具有特殊的内部属性标记 [[IsClassConstructor]]: true

    例如,与普通函数不同,必须使用 new 来调用它:

    js
    class User {
      constructor() {}
    }
    
    alert(typeof User) // function
    User() // Error: Class constructor User cannot be invoked without 'new'

    此外,大多数 JavaScript 引擎中的类构造器的字符串表示形式都以 “class…” 开头:

    js
    class User {
      constructor() {}
    }
    
    alert(User) // class User { ... }
  2. 类方法不可枚举。

    类定义将 "prototype" 中的所有方法的 enumerable 标志设置为 false

  3. 类总是使用 use strict

    在类构造中的所有代码都将自动进入严格模式。

基于 MIT 许可发布