Get to know MDN better
此页面由社区从英文翻译而来。了解更多并加入 MDN Web Docs 社区。
类是用于创建对象的模板。它们用代码封装数据以对其进行处理。JS 中的类建立在原型之上,同时还具有一些类独有的语法和语义。
更多的示例和释义,参见使用类教程。
类实际上是“特殊的函数”,就像你能够定义的函数表达式和函数声明一样,类也有两种定义方式:类表达式和类声明。
与函数表达式类似,类表达式可以是匿名的,或者也可以有一个不同于被赋值给的变量的名称的名字。然而,不同于函数声明的是,类声明具有与 let 和 const 相同的暂时性死区限制,并且表现得像是没有被提升一样。
类的主体是其被花括号 {} 包裹的部分。这里是你定义方法或构造函数等类成员的地方。
类的主体会执行在严格模式下,即便没有写 "use strict" 指令也一样。
可以从以下三个方面表述一个类元素的特征:
它们总共有 16 种可能的组合。为了更合理地划分参考文献,避免内容重叠,不同的元素会在不同的页面进行详细的介绍:
方法的定义公有的实例方法
getter公有的实例 getter 方法
setter公有的实例 setter 方法
类公有字段公有的实例字段
static公有的静态方法、静态 getter、静态 setter 和静态字段
私有元素所有私有的元素
备注:私有元素具有在同一个类种声明的所有元素的名称必须唯一的限制。其他所有的公有属性都没有这个限制——你可以写多个同名的公有属性,但是最后一个会覆盖掉其他的。此种表现与对象初始化器相同。
另外,有两种特殊的类元素语法:constructor 和静态初始化块,它们有自己的参考资料。
constructor 方法是用于创建和初始化一个由类创建的对象的特殊方法。一个类只能拥有一个名为“constructor”的特殊方法。如果类包含多个 constructor 方法,将会抛出一个 SyntaxError。
构造函数可以使用 super 关键字来调用父类的构造函数。
你可以在构造方法中创建实例的属性:
或者,如果实例属性的值不依赖构造函数的参数,那么你可以把它们定义为类字段。
静态初始化块使静态属性可以灵活初始化,包括在初始化期间执行语句、授予外部对私有作用域的访问权等。
可以声明多个静态块,并且它们可以与静态字段和方法随意穿插(所有的静态项会按照声明顺序被执行或求值)。
方法被定义在类实例的原型上并且被所有实例共享。方法可以是普通函数、异步函数、生成器函数或异步生成器函数。更多信息,参见方法的定义。
static 关键字用来定义类的静态方法或字段。静态属性(字段和方法)被定义在类的自身而不是类的实例上。静态方法通常用于为应用程序创建工具函数,而静态字段则多用于存放缓存、固定配置或其他不需要跨实例复制的数据。
使用类字段声明语法,构造函数小节的示例可以写成如下形式:
类字段与对象属性相似,不属于变量,所以我们不需要使用诸如 const 一类的关键字去声明它们。在 JavaScript 中,私有元素使用了一种特殊的语法,所以不应当使用像 public 和 private 这样的修饰符关键字。
如上文所示,声明字段时有没有默认值都可以。没有默认值的字段其值默认为 undefined。通过预先声明字段,类声明会变得自我文档化,并且字段始终显现,有助于优化代码。
参见公有类字段获取更多信息。
使用私有字段,上文的声明可以细化为如下形式:
从类的外部引用私有字段是错误的,它们只能在类主体的内部被读写。通过定义在类外部不可见的内容,你可以确保类的使用者不能依赖类的内部构造,因为内部构造随着版本更新可能会发生变化。
私有字段只能在字段声明中预先声明。它们不像普通属性那样可以通过赋值创建。
私有方法和访问器也可以使用与公有方法和访问器相同的语法来定义,但标识符以 # 开头。
更多信息,参见私有元素。
extends 关键字用于类声明或类表达式中,用以创建一个类作为另一构造函数(类或函数)的子类。
如果子类中定义了构造函数,那么它必须先调用 super() 才能使用 this。super 关键字也可以用来调用父类中对应的方法。
当一个 class 声明或 class 表达式被求值,它的各个组件将按照以下顺序被求值:
对于实例是如何被创建的,请参阅 constructor 文献。
当在没有 this 值的情况下调用一个静态方法或实例方法,例如通过将方法赋值给一个变量然后调用,在方法中,this 值将会是 undefined。即便没有写 "use strict" 指令,表现依然会相同,因为 class 主体中的代码永远是在严格模式下执行的。
如果我们用传统基于函数的语法去覆写上述方法,那么在非严格模式下,调用方法时,this 会被自动绑定到 globalThis。在严格模式下,this 值仍然是 undefined。
| ECMAScript® 2027 Language Specification # sec-class-definitions |
启用 JavaScript 以查看此浏览器兼容性表。