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
相關文章
相關標籤/搜索