new
new
new 运算符
创建一个自定义对象或具有构造函数的内置对象的实例。
语法
new constructor[([arguments])]
参数
constructor
一个指定对象实例的类型的函数。
描述
创建一个用户自定义的对象需要两步:
- 定义构造函数。
2.通过new
来创建对象实例。
创建一个对象类型需要创建一个指定了名称和属性的函数;其中这些属性可以指向它本身,也可以指向其他对象,看下面的例子:
当代码 new
Foo(...)
执行时:
- 一个新对象被创建。它继承自
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
上面的代码没有传字符串或数字过去,而是传了一个对象 rand
和 ken
,这个时候可以这样来获取car2
的拥有者的名称:
car2.owner.name
规范
Specification | Status | Comment |
---|---|---|
ECMAScript Latest Draft (ECMA-262)The definition of 'The new Operator' in that specification. | Living Standard | |
ECMAScript 2015 (6th Edition, ECMA-262)The definition of 'The new Operator' in that specification. | Standard | |
ECMAScript 5.1 (ECMA-262)The definition of 'The new Operator' in that specification. | Standard | |
ECMAScript 3rd Edition (ECMA-262)The definition of 'The new Operator' in that specification. | Standard | |
ECMAScript 1st Edition (ECMA-262)The definition of 'The new Operator' in that specification. | Standard | Initial definition. Implemented in JavaScript 1.0. |
浏览器兼容性
Feature | Chrome | Edge | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|---|
Basic support | (Yes) | (Yes) | (Yes) | (Yes) | (Yes) | (Yes) |
Feature | Android | Chrome for Android | Edge | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|---|
Basic support | (Yes) | (Yes) | (Yes) | (Yes) | (Yes) | (Yes) | (Yes) |