class

class

class 声明创建一个基于原型继承的具有给定名称的新类。

你也可以使用类表达式定义类。但是不同于类表达式,类声明不允许再次声明已经存在的类,否则将会抛出一个类型错误。

语法

class name [extends] { // class body }

描述

和类表达式一样,类声明体在严格模式下运行。构造函数是可选的。

类声明不可以提升(这与函数声明不同)。

示例

声明一个类

在下面的例子中,我们首先定义一个名为Polygon的类,然后继承它来创建一个名为Square的类。注意,构造函数中使用的 super() 只能在构造函数中使用,并且必须在使用 this 关键字前调用。

class Polygon { constructor(height, width) { this.name = 'Polygon'; this.height = height; this.width = width; } } class Square extends Polygon { constructor(length) { super(length, length   this.name = 'Square'; } }

重复定义类

重复声明一个类会引起类型错误。

class Foo {}; class Foo {}; // Uncaught TypeError: Identifier 'Foo' has already been declared

若之前使用类表达式定义了一个类,则再次声明这个类同样会引起类型错误。

var Foo = class {}; class Foo {}; // Uncaught TypeError: Identifier 'Foo' has already been declared

规范

SpecificationStatusComment
ECMAScript 2015 (6th Edition, ECMA-262)The definition of 'Class definitions' in that specification.StandardInitial definition.
ECMAScript 2016 (ECMA-262)The definition of 'Class definitions' in that specification.Standard
ECMAScript 2017 (ECMA-262)The definition of 'Class definitions' in that specification.Standard
ECMAScript Latest Draft (ECMA-262)The definition of 'Class definitions' in that specification.Living Standard

浏览器兼容性

FeatureChromeEdgeFirefox (Gecko)Internet ExplorerOperaSafari
Basic support42.0(Yes)45 (45)??10.1
Array subclassing43.0?No support???
Allowed in sloppy mode49.0?

FeatureAndroidAndroid WebviewEdgeFirefox Mobile (Gecko)IE MobileOpera MobileSafari MobileChrome for Android
Basic supportNo support42.0(Yes)45.0 (45)???42.0
Array subclassingNo support43.0?No support???43.0
Allowed in sloppy modeNo support49.0?49.0