class

关键字创建一个基于原型继承的新类(译者注:ES2015新加入的class关键字是语法糖,本质还是函数)

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

Syntax 语法

class name [extends] {
  // class body
}

Description 描述

和class表达式一样,class声明体在严格模式(strict mode)下运行。构造函数(constructor)是可选的。

Class声明不可以提升(这点和函数声明不一样)。

Examples 例子

一个类声明的例子

在下面的例子,定义了一个名为Polygon的类,然后定义了一个继承于Polygon的类 Square。注意到在构造器使用的 super(),super()只能在构造器中使用,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

Specifications 规范

Specification Status Comment
ECMAScript 2015 (6th Edition, ECMA-262)
Class definitions
Standard Initial definition.
ECMAScript Latest Draft (ECMA-262)
Class definitions
Living Standard  

Browser compatibility 浏览器兼容性

Feature Chrome Firefox (Gecko) Internet Explorer Opera Safari
Basic support 42.0 Nightly build ? ? ?
Array subclassing 43.0 未实现 ? ? ?
Feature Android Android Webview Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile Chrome for Android
Basic support 未实现 42.0 Nightly build ? ? ? 42.0
Array subclassing 未实现 43.0 未实现 ? ? ? 43.0

See also

文档标签和贡献者