`new` 运算符创建一个用户定义的对象类型的实例或具有构造函数的内置对象的实例。The `new` keyword does the following things:

1. Creates a blank, plain JavaScript object;
2. Links (sets the constructor of) this object to another object;
3. Passes the newly created object from Step 1 as the `this` context;
4. Returns `this` if the function doesn't return its own object.

## 语法

    new constructor[([arguments])]

### 参数

`constructor`
  一个指定对象实例的类型的类或函数。

`arguments`
  一个用于被 `constructor` 调用的参数列表。

## 描述

创建一个用户自定义的对象需要两步：

1. 通过编写函数来定义对象类型。
2. 通过 `new` 来创建对象实例。

创建一个对象类型，需要创建一个指定其名称和属性的函数；对象的属性可以指向其他对象，看下面的例子：

当代码 `new Foo(...)` 执行时，会发生以下事情：

1. 一个继承自 `Foo.prototype` 的新对象被创建。
2. 使用指定的参数调用构造函数 `Foo`，并将 `this` 绑定到新创建的对象。`new Foo` 等同于 `Foo``()`，也就是没有指定参数列表，`Foo` 不带任何参数调用的情况。
3. 由构造函数返回的对象就是 `new` 表达式的结果。如果构造函数没有显式返回一个对象，则使用步骤1创建的对象。（一般情况下，构造函数不返回值，但是用户可以选择主动返回对象，来覆盖正常的对象创建步骤）

你始终可以对已定义的对象添加新的属性。例如，`car1.color = "black"` 语句给 `car1` 添加了一个新的属性 `color`，并给这个属性赋值 "`black`"。但是，这不会影响任何其他对象。要将新属性添加到相同类型的所有对象，你必须将该属性添加到 `Car` 对象类型的定义中。

你可以使用 `Function.prototype` 属性将共享属性添加到以前定义的对象类型。这定义了一个由该函数创建的所有对象共享的属性，而不仅仅是对象类型的其中一个实例。下面的代码将一个值为 `null` 的 `color` 属性添加到 `car` 类型的所有对象，然后仅在实例对象 `car1` 中用字符串 "`black`" 覆盖该值。详见 prototype。

    function Car() {}
    car1 = new Car();
    car2 = new Car();

    console.log(car1.color);    // undefined

    Car.prototype.color = "original color";
    console.log(car1.color);    // original color

    car1.color = 'black';
    console.log(car1.color);   // black

    console.log(car1.__proto__.color) //original color
    console.log(car2.__proto__.color) //original color
    console.log(car1.color)  // black
    console.log(car2.color) // original color

If you didn't write the `new` operator, the Constructor Function would be invoked like any Regular Function, without creating an Object. In this case, the value of `this` is also different.

## 示例

### 对象类型和对象实例

假设你要创建一个汽车的对象类型。你希望这个类型叫做car，这个类型具备make, model, year等属性，要做到这些，你需要写这样一个函数：

    function Car(make, model, year) {
       this.make = make;
       this.model = model;
       this.year = year;
    }

现在，你可以如下所示创建一个 `mycar` 的对象：

    var mycar = new Car("Eagle", "Talon TSi", 1993);

这段代码创建了 `mycar` 并给他的属性指定值，于是 `mycar.make` 的值为"`Eagle`"， `mycar.year` 的值为1993，以此类推。

你可以通过调用 `new` 来创建任意个汽车对象。例如：

    var kenscar = new Car("Nissan", "300ZX", 1992);

### 对象属性为其他对象

假设你定义了一个对象叫做 `person`：

    function Person(name, age, sex) {
       this.name = name;
       this.age = age;
       this.sex = sex;
    }

然后实例化两个新的 `person` 对象如下：

    var rand = new Person("Rand McNally", 33, "M");
    var ken = new Person("Ken Jones", 39, "M");

然后你可以重写 `car` 的定义，添加一个值为 `person` 对象的 `owner` 属性，如下：

    function Car(make, model, year, owner) {
       this.make = make;
       this.model = model;
       this.year = year;
       this.owner = owner;
    }

为了实例化新的对象，你可以用如下代码：

    var car1 = new Car("Eagle", "Talon TSi", 1993, rand);
    var car2 = new Car("Nissan", "300ZX", 1992, ken);

创建对象时，并没有传字符串或数字给owner，而是传了对象 `rand` 和 `ken` 。这个时候，你可以这样来获取 `car2` 的owner的name：

    car2.owner.name

## 规范

Specification | Status | Comment
--- | --- | ---
ECMAScript Latest Draft (ECMA-262) The new Operator | Draft |
ECMAScript 2015 (6th Edition, ECMA-262) The new Operator | Standard |
ECMAScript 5.1 (ECMA-262) The new Operator | Standard |
ECMAScript 3rd Edition (ECMA-262) The new Operator | Standard |
ECMAScript 1st Edition (ECMA-262) The new Operator | Standard | Initial definition. Implemented in JavaScript 1.0.

## 浏览器兼容性

The compatibility table on this page is generated from structured data. If you'd like to contribute to the data, please check out https://github.com/mdn/browser-compat-data and send us a pull request.

Update compatibility data on GitHub

| Desktop | Mobile | Server
| Chrome | Edge | Firefox | Internet Explorer | Opera | Safari | Android webview | Chrome for Android | Edge Mobile | Firefox for Android | Opera for Android | Safari on iOS | Samsung Internet | Node.js
`new` | Chrome Full support Yes | Edge Full support Yes | Firefox Full support 1 | IE Full support Yes | Opera Full support Yes | Safari Full support Yes | WebView Android Full support Yes | Chrome Android Full support Yes | Edge Mobile Full support Yes | Firefox Android Full support 4 | Opera Android Full support Yes | Safari iOS Full support Yes | Samsung Internet Android Full support Yes | nodejs Full support Yes

### Legend

Full support
  Full support

## 参见

- `Function`
- `Reflect.construct()`
- `Object.prototype`