2015年12月10日 星期四

JacaScript 的 new 運算子介紹

new運算子的作用是新增一個物件範例。這個物件可以是用戶自定義的,也可以是帶建構式的一些系統自帶的物件。
語法

new constructor[([arguments])]

參數

建構式(constructor)
    一個指明了物件類型的函式。

傳參(arguments)
    一個用來被建構式呼叫的參數列表。

描述

新增一個用戶自定義的物件需要兩步:

    定義建構式。
    通過new來新增物件範例。

新增一個物件類型需要新增一個指定了名稱和屬性的函式;其中這些屬性可以指向它本身,也可以指向其他物件,看下面的例子:

當程式碼 new foo(...) 執行時:

    一個新物件被新增。它繼承自foo.prototype.
    建構式 foo 被執行。執行的時候,相應的傳參會被傳入,同時上下文(this)會被指定為這個新範例。new foo 等同於 new foo(), 只能用在不傳遞任何參數的情況。
    如果建構式返回了一個「物件」,那麼這個物件會取代整個new出來的結果。如果建構式沒有返回物件,那麼new出來的結果為步驟1新增的物件,ps:一般情況下建構式不返回任何值,不過用戶如果想覆蓋這個返回值,可以自己選擇返回一個普通物件來覆蓋。當然,返回陣列也會覆蓋,因為陣列也是物件。

任何情況下都可以對任意一個物件增加新的屬性,比如 car1.color = "black" 這句程式碼給car1增加了一個新的屬性color , 然後給這個屬性賦值 "black"。然而,這個操作不會影響任何其他物件。如果想給所有同樣類型的物件增加屬性,你需要給Car這個物件類型來增加屬性。

你可以通過給 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);

上面的程式碼沒有傳字串或數字過去,而是傳了一個物件 rand 和 ken ,這個時候可以這樣來獲取car2的擁有者的名稱:

car2.owner.name

沒有留言:

張貼留言