Get to know MDN better
此页面由社区从英文翻译而来。了解更多并加入 MDN Web Docs 社区。
constructor 是一种用于创建和初始化 class 对象实例的特殊方法。
备注:本页介绍 constructor 语法。关于所有对象的 constructor 属性,请参见 Object.prototype.constructor。
还有一些额外的语法限制:
通过构造函数,你可以在调用实例化对象的其他方法之前,提供必须完成的自定义初始化。
如果不指定构造函数,则使用默认的构造函数。如果你的类是基类,默认构造函数会是空的:
如果你的类是派生类,默认构造函数会调用父构造函数,并传递所提供的任何参数:
这样代码才能正常工作:
ValidationError 类不需要显式构造函数,因为它不需要进行任何自定义初始化。默认构造函数会根据给定的参数初始化父类 Error 。
但是,如果你提供了自己的构造函数,而你的类派生自某个父类,那么你必须使用 super() 显式地调用父类的构造函数。例如:
在类中使用 new,需要经过以下步骤:
在 constructor 主体中,你可以通过 this 访问正在创建的对象,并通过 new.target 访问用 new 调用的类。请注意,在执行 constructor 之前,方法(包括 getter 和 setter)和原型链已在 this 上初始化,因此你甚至可以从父类的构造函数访问子类的方法。但是,如果这些方法使用了 this,这时 this 尚未完全初始化。这意味着读取派生类的公共字段的结果是 undefined,而读取私有字段将导致 TypeError。
constructor 方法可能有返回值。基类可以在构造函数中返回任何值,而派生类必须返回一个对象、 undefined 值,或抛出 TypeError。
如果父类构造函数返回一个对象,则该对象将被用作 this 值,派生类的类字段将在该值上定义。这种技巧被称为“返回重载”,它允许在无关对象上定义派生类的字段(包括私有字段)。
constructor 遵循正常的方法语法,因此参数默认值、剩余参数等都可以使用。
构造函数必须是一个明确的值。计算属性不能成为构造函数。
禁止将异步方法、生成器方法、访问器和类字段称为 constructor。私有名称不能被命名为 #constructor。任何名为 constructor 的成员都必须是普通方法。
super() 调用当前类原型的构造函数。如果更改了当前类的原型,super() 将调用新原型的构造函数。更改当前类的 prototype 属性的原型不会影响 super() 调用哪个构造函数。
| ECMAScript® 2027 Language Specification # sec-static-semantics-constructormethod |
启用 JavaScript 以查看此浏览器兼容性表。