new 运算符创建一个用户定义的对象类型的实例或具有构造函数的内置对象的实例。

语法

new constructor[([arguments])]

参数

constructor
一个指定对象实例的类型的类或函数。
arguments
一个用来被constructor 调用的参数列表。

描述

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

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

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

当代码 new Foo(...) 执行时,会发生以下事情:

  1. 一个继承自 Foo.prototype 的新对象被创建。
  2. 使用指定的参数调用构造函数 Foo ,并将 this 绑定到新创建的对象。new Foo 等同于 new 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()

console.log(car1.color)           // undefined

Car.prototype.color = null
console.log(car1.color)           // null

car1.color = "black"
console.log(car1.color)           // black

示例

对象类型和对象实例

假设你要创建一个汽车的对象类型。你希望这个类型叫做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,而是传了对象 randken 。这个时候,你可以这样来获取 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.

浏览器兼容

FeatureChromeEdgeFirefoxInternet ExplorerOperaSafari
Basic support Yes Yes1 Yes Yes Yes
FeatureAndroid webviewChrome for AndroidEdge mobileFirefox for AndroidOpera AndroidiOS SafariSamsung Internet
Basic support Yes Yes Yes4 Yes Yes ?

相关链接

文档标签和贡献者

 最后编辑者: Akiq2016,