new
運算符建立一個用戶定義的對象類型的實例或具備構造函數的內置對象的實例。new
關鍵字會進行以下的操做:函數
{}
);this
的上下文 ;this
。function Car(make, model, year) {
this.make = make;
this.model = model;
this.year = year;
}this
var car1 = new Car('Eagle', 'Talon TSi', 1993);spa
console.log(car1.make);
// expected output: "Eagle"prototype
new constructor[([arguments])]
constructor
arguments
constructor
調用的參數列表。
建立一個用戶自定義的對象須要兩步:code
new
來建立對象實例。建立一個對象類型,須要建立一個指定其名稱和屬性的函數;對象的屬性能夠指向其餘對象,看下面的例子:對象
當代碼 new Foo(...)
執行時,會發生如下事情:繼承
Foo.prototype
的新對象被建立。Foo
,並將 this
綁定到新建立的對象。new Foo
等同於 new Foo
()
,也就是沒有指定參數列表,Foo
不帶任何參數調用的狀況。new
表達式的結果。若是構造函數沒有顯式返回一個對象,則使用步驟1建立的對象。(通常狀況下,構造函數不返回值,可是用戶能夠選擇主動返回對象,來覆蓋正常的對象建立步驟)你始終能夠對已定義的對象添加新的屬性。例如,car1.color = "black"
語句給 car1
添加了一個新的屬性 color
,並給這個屬性賦值 "black
"。可是,這不會影響任何其餘對象。要將新屬性添加到相同類型的全部對象,你必須將該屬性添加到 Car
對象類型的定義中。token
你可使用 Function.prototype
屬性將共享屬性添加到之前定義的對象類型。這定義了一個由該函數建立的全部對象共享的屬性,而不單單是對象類型的其中一個實例。下面的代碼將一個值爲 null
的 color
屬性添加到 car
類型的全部對象,而後僅在實例對象 car1
中用字符串 "black
" 覆蓋該值。詳見 prototype。seo
function Car() {} car1 = new Car(); car2 = new Car(); console.log(car1.color); // undefined Car.prototype.color = "original color"; console.log(car1.color); // original color car1.color = 'black'; console.log(car1.color); // black console.log(car1.__proto__.color) //original color console.log(car2.__proto__.color) //original color console.log(car1.color) // black console.log(car2.color) // original color
若是你沒有使用 new
運算符, 構造函數會像其餘的常規函數同樣被調用, 並不會建立一個對象。在這種狀況下, this
的指向也是不同的。ip
假設你要建立一個汽車的對象類型。你但願這個類型叫作car,這個類型具有make, model, year等屬性,要作到這些,你須要寫這樣一個函數:
function Car(make, model, year) { this.make = make; this.model = model; this.year = year; }
如今,你能夠以下所示建立一個 mycar
的對象:
var mycar = new Car("Eagle", "Talon TSi", 1993);
這段代碼建立了 mycar
並給他的屬性指定值,因而 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; }
而後實例化兩個新的 person
對象以下:
var rand = new Person("Rand McNally", 33, "M"); var ken = new Person("Ken Jones", 39, "M");
而後你能夠重寫 car
的定義,添加一個值爲 person
對象的 owner
屬性,以下:
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);
建立對象時,並無傳字符串或數字給owner,而是傳了對象 rand
和 ken
。這個時候,你能夠這樣來獲取 car2
的owner的name:
car2.owner.name