跳轉到內容

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'

參考資料

[編輯 | 編輯原始碼]
  1. Greg Tatum. "殺死 JavaScript 的 this". JavaScript 支援面向物件程式設計的許多替代方案的示例。一個部分 "典型的面向物件 JavaScript".
  2. Douglas Crockford. "Crockford 關於 JavaScript -- 第三幕:終極函式" pdf "Crockford 關於 JavaScript -- 第三幕:終極函式" 影片. 描述了在 JavaScript 中建立物件建構函式的幾種不同方法。


華夏公益教科書