new constructor[([arguments])]
构造函数(constructor)javascript
一个指定对象实例的类型的函数。java
传参(arguments)数组
一个用来被构造函数调用的参数列表。函数
建立一个用户自定义的对象须要两步:this
定义构造函数。prototype
经过new来建立对象实例。code
建立一个对象类型须要建立一个指定了名称和属性的函数;其中这些属性能够指向它自己,也能够指向其余对象,看下面的例子:对象
当代码 new foo(...) 执行时:继承
foo.prototype
.foo
被执行。执行的时候,相应的传参会被传入,同时上下文(this
)会被指定为这个新实例。new foo
等同于 new foo()
, 只能用在不传递任何参数的状况。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
假设你要建立一个汽车的对象类型。你但愿这个类型叫作 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