JavaScript/建構函式和原型
外觀
該new運算子基於建構函式和原型建立新的物件。
建構函式是一個與物件名稱匹配的函式,當被 new 運算子呼叫時,關鍵字this被分配給新建立的物件例項。建構函式可以根據需要分配任何初始變數。
function CoinObject() {
this.value = 0;
}
var slug = new CoinObject(); // Creates a "slug" - a valueless coin (slug.value = 0).
建構函式可以接受引數 - 但是,無法透過具有不同數量引數的多個函式來過載建構函式。
(該new語句是從建構函式建立新 JavaScript 物件的最常見方法,但一些 JavaScript 程式設計師有時會使用替代技術。[1][2] )
物件的原型是一組自動建立的欄位和方法。它不能獨立執行,依賴於現有的建構函式。
建立物件時,原型中初始化的欄位將被複制到新建立的物件。
function CoinObject() {
this.value = 0;
}
CoinObject.prototype.diameter = 1;
slug = new CoinObject(); // A valueless coin (slug.value = 0), with diameter of 1 (slug.diameter = 1)
由於物件的原型表現為物件,因此可以使用它來建立繼承。
JavaScript 中的物件是完全動態的,如果物件中不存在欄位,則可以立即建立該欄位。例如,如果您發現現在需要跟蹤硬幣示例中的厚度,則可以簡單地將新欄位新增到原型。
更改物件的原型允許物件的現有例項訪問該更改。
當在新物件上分配屬性值時,該屬性優先於其祖先的原型屬性。如果您從新物件中刪除該屬性,則繼承鏈將帶您回到父物件的屬性。
為了演示,一個Animal建構函式用於建立一個名為 Spot 的物件。在建立之後,建構函式添加了一個性別屬性。該性別屬性也可以從 Spot 的物件訪問。
性別屬性可以更新,如果從狗物件中刪除性別屬性,它將從其祖先而不是Animal建構函式中檢索所需的屬性。
function Animal (type, name) {
this.type = type || 'No type';
this.name = name || 'No name';
}
var dog = new Animal('dog', 'Spot');
// Add gender to the Animal object
Animal.prototype.gender = 'unspecified';
// dog.gender is 'unspecified'
dog.gender = 'male';
// dog.gender is 'male';
delete(dog.gender);
// dog.gender is once again, 'unspecified'
- ↑ Greg Tatum. "殺死 JavaScript 的 this". JavaScript 支援面向物件程式設計的許多替代方案的示例。一個部分 "典型的面向物件 JavaScript".
- ↑ Douglas Crockford. "Crockford 關於 JavaScript -- 第三幕:終極函式" pdf "Crockford 關於 JavaScript -- 第三幕:終極函式" 影片. 描述了在 JavaScript 中建立物件建構函式的幾種不同方法。