课程

基线 广泛可用

此功能已得到很好的建立,可在许多设备和浏览器版本中使用。从那时起,它就可以跨浏览器使用了 2017年3月.

类是用于创建对象的模板。它们用代码封装数据以处理该数据。JS中的类是基于原型但也有一些类特有的语法和语义。

有关更多示例和说明,请参阅使用类指南。

描述

定义类

类实际上是“特殊的”功能“,正如您可以定义的那样函数表达式函数声明,类可以通过两种方式定义:类表达式或a类声明.

js公司
//声明类矩形{构造(高度、宽度){this.height=高度;this.width=宽度;}}//表达;该类是匿名的,但分配给了一个变量const矩形=类{构造(高度、宽度){this.height=高度;this.width=宽度;}};//表达;这个类有自己的名称const矩形=类矩形2{构造(高度、宽度){this.height=高度;this.width=宽度;}};

与函数表达式一样,类表达式可能是匿名的,或者其名称与指定给它的变量不同时间死区限制为常数表现得好像他们是未吊装.

类主体

类的主体是花括号中的部分{}。这是定义类成员的位置,例如方法或构造函数。

类的主体在中执行严格模式即使没有“使用严格”指令。

类元素可以由三个方面来表征:

  • 类型:Getter、setter、方法或字段
  • 位置:静态或实例
  • 可见性:公共或私人

它们加起来总共有16种可能的组合。为了更合理地划分参考并避免内容重叠,在不同的页面中详细介绍了不同的元素:

方法定义

公共实例方法

吸气剂

公共实例getter

设置器

公共实例设置器

公共类字段

公共实例字段

静止的

公共静态方法、getter、setter和field

私人财产

所有隐私

注:私有属性有一个限制,即在同一类中声明的所有属性名称都必须是唯一的。所有其他公共属性都没有此限制-可以有多个同名的公共属性,最后一个属性会覆盖其他属性。这与中的行为相同对象初始值设定项.

此外,还有两种特殊的类元素语法:建造师静态初始化块,以及他们自己的参考。

施工单位

这个建造师方法是一种特殊的方法,用于创建和初始化用类创建的对象。类中只能有一个名为“constructor”的特殊方法-a语法错误如果类包含多个建造师方法。

构造函数可以使用超级的关键字来调用超类的构造函数。

您可以在构造函数中创建实例属性:

js公司
类矩形{构造(高度、宽度){this.height=高度;this.width=宽度;}}

或者,如果实例属性的值不依赖于构造函数的参数,则可以将其定义为类字段.

静态初始化块

静态初始化块允许灵活初始化静态特性,包括初始化期间对语句的求值,同时授予对私有作用域的访问权限。

可以声明多个静态块,这些块可以与静态字段和方法的声明交错(所有静态项都按声明顺序计算)。

方法

方法在每个类实例的原型上定义,并由所有实例共享。方法可以是普通函数、异步函数、生成器函数或异步生成器函数。有关更多信息,请参阅方法定义.

js公司
类矩形{构造(高度、宽度){this.height=高度;this.width=宽度;}//Getter公司获取区域(){return this.calcArea();}//方法计算区域(){返回this.height*this.width;}*获取侧面(){屈服高度;产生这个宽度;屈服高度;屈服宽度;}}const square=新矩形(10,10);console.log(方形面积);//100console.log([…square.getSides()]);//[10, 10, 10, 10]

静态方法和字段

这个静止的关键字定义类的静态方法或字段。静态属性(字段和方法)是在类本身而不是每个实例上定义的。静态方法通常用于为应用程序创建实用程序函数,而静态字段对于缓存、固定配置或不需要跨实例复制的任何其他数据都很有用。

js公司
类点{构造函数(x,y){这个.x=x;this.y=y;}static displayName=“Point”;静态距离(a,b){常数dx=a.x-b.x;常数dy=a.y-b.y;return Math.hyp(dx,dy);}}const p1=新点(5,5);const p2=新点(10,10);p1.displayName;//未定义p1.距离;//未定义p2.displayName;//未定义p2.距离;//未定义console.log(Point.displayName);//“点”控制台.log(点距离(p1,p2));//7.0710678118654755

字段声明

使用类字段声明语法建造师示例可以写成:

js公司
类矩形{高度=0;宽度;构造(高度、宽度){this.height=高度;this.width=宽度;}}

类字段类似于对象属性,而不是变量,因此我们不使用诸如常数来申报。在JavaScript中,私人财产使用特殊的标识符语法,所以修饰符关键字如下公众的私有的也不应使用。

如上所述,字段可以声明为带有或不带有默认值。没有默认值的字段默认为未定义。通过预先声明字段,类定义变得更加自文档化,并且字段始终存在,这有助于优化。

请参阅公共类字段了解更多信息。

私人财产

使用私有字段,可以如下细化定义。

js公司
类矩形{#高度=0;#宽度;构造(高度、宽度){这个#高度=高度;这个#宽度=宽度;}}

从类外部引用私有字段是错误的;它们只能在类主体中读取或写入。通过定义在类外部不可见的内容,可以确保类的用户不能依赖内部组件,内部组件可能会因版本而异。

私有字段只能在字段声明中预先声明。以后不能通过指定给它们来创建它们,这是普通属性可以做到的。

有关更多信息,请参阅私人财产.

继承

这个延伸关键字用于类声明类表达式创建一个类作为另一个构造函数(类或函数)的子类。

js公司
类动物{建造师(姓名){this.name=名称;}拼写(){console.log(`${this.name}发出噪音。`);}}类狗延伸动物{建造师(姓名){super(名称);//调用超类构造函数并传入name参数}演讲(){console.log(`${this.name}barks.`);}}const d=新狗(“Mitzie”);d.speak();//米齐吠叫着。

如果子类中存在构造函数,则需要首先调用super()使用前. The超级的关键字也可以用来调用超类的相应方法。

js公司
类别Cat{建造师(姓名){this.name=名称;}演讲(){console.log(`${this.name}发出噪音。`);}}狮子延伸猫类{演讲(){super.speak();console.log(`${this.name}咆哮。`);}}const l=新狮子(“模糊”);l.speak();//模糊会发出噪音。//模糊咆哮。

评估顺序

宣言表达则其各个组件按以下顺序进行评估:

  1. 这个延伸子句(如果存在)首先被求值。它必须计算为有效的构造函数或无效的,或a类型错误被抛出。
  2. 这个建造师方法,如果建造师不存在。然而,因为建造师定义只是一个方法定义,这个步骤是不可观察的。
  3. 类元素的属性键按声明的顺序进行计算。如果计算了属性键,则使用值设置为类周围的值(而不是类本身)。尚未计算任何属性值。
  4. 方法和访问器是按照声明的顺序安装的。实例方法和访问器安装在原型属性,并且静态方法和访问器安装在类本身上。将保存私有实例方法和访问器,以便稍后直接安装到实例上。此步骤不可见。
  5. 该类现在使用指定的原型进行初始化延伸和由指定的实现建造师。对于上述所有步骤,如果计算的表达式尝试访问类的名称引用错误引发,因为该类尚未初始化。
  6. 类元素的值按声明的顺序进行计算:
    • 对于每个实例字段(public或private),则保存其初始值设定项表达式。在实例创建期间,在构造函数的开始(对于基类)或紧邻super()调用返回(对于派生类)。
    • 对于每个静电场(公共或私有),其初始值设定项使用设置为类本身,则在类上创建属性。
    • 静态初始化块被评估为设置为类本身。
  7. 该类现在已完全初始化,可以用作构造函数。

有关如何创建实例的信息,请参见建造师参考。

示例

将其与实例和静态方法绑定

调用静态或实例方法时,没有,例如通过将方法分配给变量,然后调用它值将为未定义方法内部。即使“使用严格”指令不存在,因为body始终以严格模式执行。

js公司
类动物{演讲(){返回此;}静态eat(){返回此;}}const obj=新动画();obj.speak();//动物对象const speak=obj.speak;speak();//未定义动物eat();//类动物const eat=动画吃;eat();//未定义

如果我们在非严格模式下使用传统的基于函数的语法重写上述内容,那么方法调用自动绑定到全局此.在严格模式下保持为未定义.

js公司
函数Animal(){}Animal.prototype.speak=函数(){返回此;};Animal.eat=函数(){返回此;};const obj=新动画();const speak=对象峰值;speak();//全局对象(非严格模式)const eat=动物吃;eat();//全局对象(非限制模式)

规格

规范
ECMAScript语言规范
#sec-class定义

浏览器兼容性

BCD表仅在浏览器中加载

另请参见