diff --git a/files/zh-cn/web/javascript/reference/operators/new/index.md b/files/zh-cn/web/javascript/reference/operators/new/index.md index 1a7ceb3552df4f..24512afa5cb9e4 100644 --- a/files/zh-cn/web/javascript/reference/operators/new/index.md +++ b/files/zh-cn/web/javascript/reference/operators/new/index.md @@ -11,27 +11,34 @@ slug: Web/JavaScript/Reference/Operators/new ## 语法 -```plain -new constructor[([arguments])] +```js-nolint +new constructor +new constructor() +new constructor(arg1) +new constructor(arg1, arg2) +new constructor(arg1, arg2, /* …, */ argN) ``` ### 参数 - `constructor` - : 一个指定对象实例的类型的类或函数。 -- `arguments` - - : 一个用于被 `constructor` 调用的参数列表。 +- `arg1`、`arg2`、……、`argN` + - : 一个用于被 `constructor` 调用的值列表。`new Foo` 与 `new Foo()` 等价,例如:如果没有指定参数列表,则在不带参数的情况下调用 `Foo`。 ## 描述 -**`new`** 关键字会进行如下的操作: +当使用 **`new`** 关键字调用函数时,该函数将被用作构造函数。`new` 将执行以下操作: -1. 创建一个空的简单 JavaScript 对象(即 **`{}`**); -2. 为步骤 1 新创建的对象添加属性 **`__proto__`**,将该属性链接至构造函数的原型对象; -3. 将步骤 1 新创建的对象作为 **`this`** 的上下文; -4. 如果该函数没有返回对象,则返回 **`this`**。 +1. 创建一个空的简单 JavaScript 对象。为方便起见,我们称之为 `newInstance`。 +2. 如果构造函数的 `prototype` 属性是一个{{jsxref("Object", "对象", "", 1)}},则将 `newInstance` 的 [[Prototype]] 指向构造函数的这个属性,否则 `newInstance` 将保持为一个普通对象,其 [[Prototype]] 为 `Object.prototype`。 -(译注:关于对象的 **`constructor`**,参见 **`Object.prototype.constructor`**) + > **备注:** 因此,通过构造函数创建的所有实例都可以访问添加到构造函数 `prototype` 属性中的属性/对象。 + +3. 使用给定参数执行构造函数,并将 `newInstance` 绑定为 [`this`](/zh-CN/docs/Web/JavaScript/Reference/Operators/this) 的上下文(例如,在构造函数中的所有 `this` 引用都指向 `newInstance`)。 +4. 如果构造函数返回[非原始值](/zh-CN/docs/Web/JavaScript/Data_structures#原始值),则该返回值成为整个 `new` 表达式的结果。否则,如果构造函数未返回任何值或返回了一个原是值,则返回 `newInstance`。(通常构造函数不返回值,但可以选择返回值,以覆盖正常的对象创建过程。) + +[类](/zh-CN/docs/Web/JavaScript/Reference/Classes)只能用 `new` 运算符实例化——尝试不使用 `new` 调用一个类将抛出 `TypeError`。 创建一个用户自定义的对象需要两步: