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