首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

new

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

语法

代码语言:javascript
复制
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

代码语言:javascript
复制
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等属性,要做到这些,你需要这样来写个构造函数:

代码语言:javascript
复制
function Car(make, model, year) {
  this.make = make;
  this.model = model;
  this.year = year;
}

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

代码语言:javascript
复制
var mycar = new Car('Eagle', 'Talon TSi', 1993);

这段代码创建一个mycar这个对象实例,还给它赋予3个属性,现在mycar.make等于"Eagle", mycar.year 等于1993,以此类推。

你已经可以通过new来创建任意个汽车对象实例:

代码语言:javascript
复制
var kenscar = new Car('Nissan', '300ZX', 1992);

对象属性为自身或其他对象

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

代码语言:javascript
复制
function Person(name, age, sex) {
  this.name = name;
  this.age = age;
  this.sex = sex;
}

然后定义了两个实例:

代码语言:javascript
复制
var rand = new Person('Rand McNally', 33, 'M');
var ken = new Person('Ken Jones', 39, 'M');

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

代码语言:javascript
复制
function Car(make, model, year, owner) {
  this.make = make;
  this.model = model;
  this.year = year;
  this.owner = owner;
}

创建实例变成了这样:

代码语言:javascript
复制
var car1 = new Car('Eagle', 'Talon TSi', 1993, rand);
var car2 = new Car('Nissan', '300ZX', 1992, ken);

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

代码语言:javascript
复制
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)

扫码关注腾讯云开发者

领取腾讯云代金券

http://www.vxiaotou.com