new

new 運算符建立一個用戶定義的對象類型的實例或具備構造函數的內置對象的實例。new 關鍵字會進行以下的操做:函數

  1. 建立一個空的簡單JavaScript對象(即{});
  2. 連接該對象(即設置該對象的構造函數)到另外一個對象 ;
  3. 將步驟1新建立的對象做爲this的上下文 ;
  4. 若是該函數沒有返回對象,則返回this
  5. 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

  1. 經過編寫函數來定義對象類型。
  2. 經過 new 來建立對象實例。

建立一個對象類型,須要建立一個指定其名稱和屬性的函數;對象的屬性能夠指向其餘對象,看下面的例子:對象

當代碼 new Foo(...) 執行時,會發生如下事情:繼承

  1. 一個繼承自 Foo.prototype 的新對象被建立。
  2. 使用指定的參數調用構造函數 Foo,並將 this 綁定到新建立的對象。new Foo 等同於 new Foo(),也就是沒有指定參數列表,Foo 不帶任何參數調用的狀況。
  3. 由構造函數返回的對象就是 new 表達式的結果。若是構造函數沒有顯式返回一個對象,則使用步驟1建立的對象。(通常狀況下,構造函數不返回值,可是用戶能夠選擇主動返回對象,來覆蓋正常的對象建立步驟)

你始終能夠對已定義的對象添加新的屬性。例如,car1.color = "black" 語句給 car1 添加了一個新的屬性 color,並給這個屬性賦值 "black"。可是,這不會影響任何其餘對象。要將新屬性添加到相同類型的全部對象,你必須將該屬性添加到 Car 對象類型的定義中。token

你可使用 Function.prototype 屬性將共享屬性添加到之前定義的對象類型。這定義了一個由該函數建立的全部對象共享的屬性,而不單單是對象類型的其中一個實例。下面的代碼將一個值爲 null 的 color 屬性添加到 car 類型的全部對象,而後僅在實例對象 car1 中用字符串 "black" 覆蓋該值。詳見 prototypeseo

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