JavaScript中的類別(Class)詳細介紹_javascript技巧
在JavaScript中,可以使用類別(Class)來實作物件導向程式設計(Object Oriented Programming)。不過,JavaScript中的類別與Java中的有所不同,其對應的定義和使用也不一樣。
JavaScript中類別的定義
在JavaScript中,所有從同一個原型物件(prototype)衍生出來的物件組成了一個類別;也就是說,JavaScript中的類別是一個物件集合的概念,如果兩個物件它們的prototype相同,那麼它們就屬於同一個類別;JavaScript中的類別甚至不需要類別名稱。以下面的程式碼為例:
var p = {x:42};
var a = Object.create(p);
var b = Object.create(p);
console.log(a === b);//false
console.log(Object.getPrototypeOf(a) === Object.getPrototypeOf(b));//true
在上述例子中,物件a和b擁有相同的原型物件(prototype) p,因此a和b屬於同一個類別(雖然這個類別都沒有類別名稱),它們從原型物件p處繼承了值為42的屬性x。
從這個例子可以看到,原型對象的作用就相當於模板,可以由之衍生/創建出多個對象,其地位與Java語言中的類代碼(Class code)相同,是JavaScript中類定義的核心。以下這個範例中的原型物件就呈現出更像類別程式碼的樣子:
var p = {
INCREMENT_BY : 1,
increment : function(x){
return x this.INCREMENT_BY;
}
}
var a = Object.create(p);
var b = Object.create(p);
console.log(a.increment(7));//8
console.log(b.increment(9));//10
在上述例子中,原型物件p定義了一個值為1的property (INCREMENT_BY)和一個名為increment的函數;物件a和b從p這個範本取得了INCREMENT_BY和increment函數。當呼叫物件a或b的increment函數時,JavaScript會試圖取得a或b的INCREMENT_BY值(this.INCREMENT_BY);由於INCREMENT_BY是從p中取得的,因此其值都是1 — 從範本中取得的,值都相同的變量,類似於Java中的靜態類別變數(static variable),因此上面的範例中對INCREMENT_BY變數命名時使用了全大寫字元。
在上面的範例中,所有從模板p處創建出來的物件(屬於同一個類別的這些物件),其屬性和行為都是一模一樣的。但實際上對於同一個類別的不同對象,它們除了擁有類別所定義的屬性/行為以外,往往具有一些自身所特有的屬性與行為。因此,如果需要將prototype這個模板當作類別來使用的話,就必須對每一個從中衍生出來的物件進行一定的自訂:
var p = {
INCREMENT_BY : 1,
increment : function(x){
return x this.INCREMENT_BY this.custom_increment_by;
}
}
var a = Object.create(p);
var b = Object.create(p);
a.custom_increment_by = 0;
b.custom_increment_by = 1;
console.log(a.increment(7));//8
console.log(b.increment(9));//11
在這個範例中,從範本p建立出來的物件a和b擁有一個彼此間值不一定相等的變數custom_increment_by,而它們的increment()函數這個行為的最終結果則與custom_increment_by的值相關。一般來說,對新建物件進行客製化的工作往往放在統一的函數中進行:
var p = {
INCREMENT_BY : 1,
increment : function(x){
return x this.INCREMENT_BY this.custom_increment_by;
}
}
function getIncrementalClassObject(customIncrementByValue){
var incrementalObj = Object.create(p);
incrementalObj.custom_increment_by = customIncrementByValue;
return incrementalObj;
}
var a = getIncrementalClassObject(0);
var b = getIncrementalClassObject(1);
console.log(a.increment(7));//8
console.log(b.increment(9));//11
如此,便透過原型物件p和getIncrementalClassObject()函數完成了一個類別的定義:可以透過呼叫getIncrementalClassObject()函數來取得原型物件都是p的對象,而在呼叫getIncrementalClassObject()函數過程中可以對這些新建對象進行一定的客製化。值得注意的是,此時這個已經定義了的類別還沒有類別名,為了方便描述,姑且稱之為Incremental。
回顧getIncrementalClassObject()函數所做的工作,可以看到從Incremental這個類別中建立新的物件所經歷的過程如下:
1.建立一個空對象,並將其原型對象定義為p。
2.根據不同的參數值,對這個新建的空物件進行自訂。
3.傳回已經定製完成的新物件。
在JavaScript中,可以透過使用Constructor(建構子)來快速地完成類別的定義以及新物件的建立。
JavaScript中的Constructor(建構子)
從上述Incremental類別這個範例可以看到,定義新的類別需要兩部分程式碼:建立原型物件作為範本、建立自訂函數對新物件進行初始化;而從類別中建立新的物件則經歷了三個過程:指定新物件的原型物件、自訂/初始化新物件、傳回這個新物件。在JavaScript中,這一切都可以透過Constructor(建構子)來完成。
JavaScript中的Constructor是一個函數(function),承擔對新物件進行初始化的職責;而這個Constructor函數的prototype則是用來建立新物件。仍以上述Incremental類別為例,用Constructor來重寫程式碼後是這樣的:
function Incremental(customIncrementByValue){
this.custom_increment_by = customIncrementByValue;
}
Incremental.prototype = {
INCREMENT_BY : 1,
increment : function(x){
return x this.INCREMENT_BY this.custom_increment_by;
}
}
var a = new Incremental(0);
var b = new Incremental(1);
console.log(a.increment(7));//8
console.log(b.increment(9));//11
透過new關鍵字,使用Constructor函數來建立新物件這個過程,實際上經歷了以下階段:
建立一個新的空物件。
1.將這個物件的原型物件指向constructor函數的prototype屬性。
2.將這個物件作為this參數,執行constructor函數。
3.這與之前的getIncrementalClassObject()函數中所做的工作是一樣的。
類別名稱
在使用Constructor建立物件時,對應的物件也就有了“類別名稱”,這可以從instanceof操作符的結果上得到驗證:
console.log(a instanceof Incremental);//true
console.log(b instanceof Incremental);//true
不過,instanceof操作子並不會判斷物件是否由Incremental這一建構函數所創建,instanceof操作符只判斷物件的原型物件是否為Incremental.prototype。當存在兩個prototype一樣的建構子時,instanceof運算子會統一傳回true,而不會區分用來建立物件的建構函式到底是哪個。
function Incremental2(customIncrementByValue){
this.custom_increment_by = customIncrementByValue 3;
}
Incremental2.prototype = Incremental.prototype;
console.log(a instanceof Incremental2);//true

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

如何使用WebSocket和JavaScript實現線上語音辨識系統引言:隨著科技的不斷發展,語音辨識技術已成為了人工智慧領域的重要組成部分。而基於WebSocket和JavaScript實現的線上語音辨識系統,具備了低延遲、即時性和跨平台的特點,成為了廣泛應用的解決方案。本文將介紹如何使用WebSocket和JavaScript來實現線上語音辨識系

WebSocket與JavaScript:實現即時監控系統的關鍵技術引言:隨著互聯網技術的快速發展,即時監控系統在各個領域中得到了廣泛的應用。而實現即時監控的關鍵技術之一就是WebSocket與JavaScript的結合使用。本文將介紹WebSocket與JavaScript在即時監控系統中的應用,並給出程式碼範例,詳細解釋其實作原理。一、WebSocket技

JavaScript和WebSocket:打造高效的即時天氣預報系統引言:如今,天氣預報的準確性對於日常生活以及決策制定具有重要意義。隨著技術的發展,我們可以透過即時獲取天氣數據來提供更準確可靠的天氣預報。在本文中,我們將學習如何使用JavaScript和WebSocket技術,來建立一個高效的即時天氣預報系統。本文將透過具體的程式碼範例來展示實現的過程。 We

JavaScript教學:如何取得HTTP狀態碼,需要具體程式碼範例前言:在Web開發中,經常會涉及到與伺服器進行資料互動的場景。在與伺服器進行通訊時,我們經常需要取得傳回的HTTP狀態碼來判斷操作是否成功,並根據不同的狀態碼來進行對應的處理。本篇文章將教你如何使用JavaScript來取得HTTP狀態碼,並提供一些實用的程式碼範例。使用XMLHttpRequest

jQuery是一種經典的JavaScript庫,被廣泛應用於網頁開發中,它簡化了在網頁上處理事件、操作DOM元素和執行動畫等操作。在使用jQuery時,常會遇到需要取代元素的class名稱的情況,本文將介紹一些實用的方法,以及具體的程式碼範例。 1.使用removeClass()和addClass()方法jQuery提供了removeClass()方法來刪除

在編寫PHP程式碼時,使用類別(Class)是一個非常常見的做法。透過使用類,我們可以將相關的功能和資料封裝在一個單獨的單元中,使程式碼更加清晰、易於閱讀和易於維護。本文將詳細介紹PHPClass的用法,並提供具體的程式碼範例,幫助讀者更好地理解如何在實際專案中應用類別來優化程式碼。 1.建立和使用類別在PHP中,可以使用關鍵字class來定義一個類,並在類別中定義屬性和方法。

JavaScript中的HTTP狀態碼取得方法簡介:在進行前端開發中,我們常常需要處理與後端介面的交互,而HTTP狀態碼就是其中非常重要的一部分。了解並取得HTTP狀態碼有助於我們更好地處理介面傳回的資料。本文將介紹使用JavaScript取得HTTP狀態碼的方法,並提供具體程式碼範例。一、什麼是HTTP狀態碼HTTP狀態碼是指當瀏覽器向伺服器發起請求時,服務

什麼是物件導向程式設計?物件導向程式設計(OOP)是一種程式設計範式,它將現實世界中的實體抽象化為類,並使用物件來表示這些實體。類別定義了物件的屬性和行為,而物件則實例化了類別。 OOP的主要優點在於它可以使程式碼更易於理解、維護和重複使用。 OOP的基本概念OOP的主要概念包括類別、物件、屬性和方法。類別是物件的藍圖,它定義了物件的屬性和行為。物件是類別的實例,它具有類別的所有屬性和行為。屬性是物件的特徵,它可以儲存資料。方法是物件的函數,它可以對物件的資料進行操作。 OOP的優點OOP的主要優點包括:可重複使用性:OOP可以讓程式碼更
