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出来的结果。如果构造函数没有返回对象,那么new出来的结果为步骤1创建的对象。(一般情况下构造函数不返回任何值,不过用户如果想覆盖这个返回值,可以自己选择返回一个普通对象来覆盖。当然,返回数组也会覆盖,因为数组也是对象。)

任何情况下都可以对任意一个对象添加新的属性,例如 car1.color = "black" 语句给car1添加了一个新的属性color , 然后给这个属性赋值 "black"。但是,这不会影响任何其他对象。要将新属性添加到相同类型的所有对象,必须将该属性添加到Car对象类型的定义中。

你可以通过给 Function.prototype 添加属性的方式来给所有先前定义的实例来添加属性。这定义了一个由该函数创建的所有对象共享的属性,而不仅仅是对象类型的一个实例。下面的代码将一个值为null的颜色属性添加到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;
}

现在,你可以创建一个实例:

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

这段代码创建一个mycar这个对象实例,还给它赋予3个属性,现在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;
}

然后定义了两个实例:

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

然后你重写了car的定义,添加了一个owner属性来指向一个person对象实例:

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);

上面的代码没有传字符串或数字过去,而是传了一个对象 randken ,这个时候可以这样来获取car2的拥有者的名称:

car2.owner.name

规范

Specification Status Comment
ECMAScript Latest Draft (ECMA-262)
The new Operator
Living Standard  
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 Yes Yes Yes Yes Yes
FeatureAndroid webviewChrome for AndroidEdge mobileFirefox for AndroidIE mobileOpera AndroidiOS Safari
Basic support Yes Yes Yes Yes Yes Yes Yes

相关链接

文档标签和贡献者

 最后编辑者: zhangchen,