new
new 运算符创建一个自定义对象或具有构造函数的内置对象的实例。
语法
new constructor[([arguments])]参数
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) | 
本文档系腾讯云开发者社区成员共同维护,如有问题请联系 cloudcommunity@tencent.com

