new 运算符

语法

new constructor[([arguments])]

参数

构造函数(constructor)javascript

一个指定对象实例的类型的函数。java

传参(arguments)数组

一个用来被构造函数调用的参数列表。函数

描述

建立一个用户自定义的对象须要两步:this

  1. 定义构造函数。prototype

  2. 经过new来建立对象实例。code

建立一个对象类型须要建立一个指定了名称和属性的函数;其中这些属性能够指向它自己,也能够指向其余对象,看下面的例子:对象

当代码 new foo(...) 执行时:继承

  1. 一个新对象被建立。它继承自 foo.prototype.
  2. 构造函数 foo 被执行。执行的时候,相应的传参会被传入,同时上下文(this)会被指定为这个新实例。new foo 等同于 new foo(), 只能用在不传递任何参数的状况。
  3. 若是构造函数返回了一个“对象”,那么这个对象会取代整个 new 出来的结果。若是构造函数没有返回对象,那么 new 出来的结果为步骤1建立的对象,ps:通常状况下构造函数不返回任何值,不过用户若是想覆盖这个返回值,能够本身选择返回一个普通对象来覆盖。固然,返回数组也会覆盖,由于数组也是对象。

任何状况下均可以对任意一个对象添加新的属性,好比 car1.color = "black" 这句代码给 car1 添加了一个新的属性 color , 而后给这个属性赋值 black。然而,这个操做不会影响任何其余对象。若是想给全部一样类型的对象添加属性,你须要给 Car 这个对象类型来添加属性。ip

你能够经过给 Function.prototype 添加属性的方式来给全部先前定义的实例来添加属性。这种定义属性的方式会影响到全部经过 new 构造函数建立的对象,由于它们共享了这个对象类型。下面的代码给实例 car 的对象类型添加了一个 color 属性 null,而后又给实例 car1 覆盖了 color 属性 black,详见 prototype.

function Car() {}
 car1 = new Car()
 
 alert(car1.color)           // undefined
 
 Car.prototype.color = null
 alert(car1.color)           // null
 
 car1.color = "black"
 alert(car1.color)           // black

例子

例1:对象类型和对象实例

假设你要建立一个汽车的对象类型。你但愿这个类型叫作 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);

例2: 对象属性为自身或其余对象

假设你定义了一个对象叫作 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
相关文章
相关标签/搜索