首頁 web前端 js教程 基於JavaScript實作繼承機制之建構函數 原型鏈混合方式的使用詳解_javascript技巧

基於JavaScript實作繼承機制之建構函數 原型鏈混合方式的使用詳解_javascript技巧

May 16, 2016 pm 05:34 PM
建構函數

建構子、原型實作繼承的缺陷

首先來分析建構子和原型鏈兩種實作繼承方式的缺陷:

建構函式(物件冒充)的主要問題是必須使用建構函式方式,且無法繼承透過原型定義的方法,這不是最好的選擇。不過如果使用原型鏈,就無法使用帶有參數的建構函數了。開發者如何選擇?答案很簡單,兩者都用。

建構子 原型混合方式

這種繼承方式使用建構函式定義類,並非使用任何原型。創建類別的最好方式是用建構函數定義屬性,用原型定義方法。這種方式同樣適用於繼承機制,用物件冒充繼承建構函式的屬性,用原型鏈繼承 prototype 物件的方法。用這兩種方式重寫前面的例子,程式碼如下:

複製程式碼 程式碼如下:

function ClassA(sColor) {
    this.color = sColor;
}

ClassA.prototype.sayColor = function () {
    alert(this.color);
};

function ClassB(sColor, sName) {
    ClassA.call(this, sColor);
    this.name = sName;
}

ClassB.prototype = new ClassA();

ClassB.prototype.sayName = function () {
    alert(this.name);
};


在此例子中,繼承機制由兩行突出顯示的藍色代碼實現。在第一行反白的程式碼中,在 ClassB 建構函式中,用物件冒充繼承 ClassA 類別的 sColor 屬性。在第二行反白的程式碼中,用原型鏈繼承 ClassA 類別的方法。由於這種混合方式使用了原型鏈,所以 instanceof 運算子仍能正確運作。

下面的範例測試了這段程式碼:
複製程式碼


程式碼如下:


var objA = new ClassA("blue");
var objB = new ClassB("red", "John");
objA.sayColor();    //輸出"blue"
objB.sayColor();    //輸出"red"objB.sayName();    //輸出"John"
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

Python中的建構函數 Python中的建構函數 Sep 02, 2023 pm 04:29 PM

在Python中,每個類別都有一個建構函數,它是類別內部指定的特殊方法。建構函數/初始化程序將在為類別建立新物件時自動呼叫。當物件被初始化時,建構函數將值指派給類別中的資料成員。沒有必要明確定義建構函數。但為了創建建構函數,我們需要遵循以下規則-對於一個類,它只允許有一個建構函數。建構函式名稱必須是__init__。必須使用實例屬性定義建構函式(只需將self關鍵字指定為第一個參數)。它不能傳回除None之外的任何值。語法classA():def__init__(self):pass範例考慮下面的範例並

C++語法錯誤:相同的建構函式簽章出現多次,該怎麼解決? C++語法錯誤:相同的建構函式簽章出現多次,該怎麼解決? Aug 22, 2023 pm 04:49 PM

C++是一門強大的程式語言,但在使用過程中,難免會遇到各種問題。其中,相同的建構函式簽章出現多次就是一種常見的語法錯誤。本文將介紹這種錯誤的原因和解決方法。一、錯誤原因在C++中,建構函式用來建立物件時初始化物件的資料成員。但是,如果在同一個類別中定義了相同的建構函式簽章(即參數型別和順序相同),編譯器就無法確定要呼叫哪一個建構函數,進而造成編譯錯誤。例如,

go語言有建構子嗎 go語言有建構子嗎 Jan 10, 2023 pm 02:15 PM

go語言沒有建構子。 go語言作為結構化的語言是沒有物件導向語言中的建構方法的,不過可以透過一些方式實現類似的物件導向語言中建構方法的效果,也就是使用結構體初始化的過程來模擬實現構造函數。

C++語法錯誤:定義在類別外的建構子必須加上類別名稱作為限定符,該怎麼改正? C++語法錯誤:定義在類別外的建構子必須加上類別名稱作為限定符,該怎麼改正? Aug 22, 2023 pm 02:00 PM

C++是一種廣泛使用的物件導向程式語言,C++中定義類別的建構函式時,如果希望將建構函式的定義放在類別外部,那麼就需要在建構函式的定義中加上類別名稱作為限定符,以指定這個建構函式是屬於哪個類別的。這是C++語法的一條基本規定。如果在定義類別的建構子時沒有遵守這個規定,就會出現編譯錯誤,提示「定義在類別外的建構子必須加上類別名稱作為限定符」。那麼,如果碰到這種編譯錯誤,應該

C++報錯:建構子必須在public區域聲明,怎麼處理? C++報錯:建構子必須在public區域聲明,怎麼處理? Aug 21, 2023 pm 08:26 PM

在C++程式設計中,建構子是用來初始化類別的成員變數的重要函式。它在創建物件時自動調用,以確保物件的正確初始化。建構子必須在類別中聲明,但是有時會遇到錯誤提示「建構子必須在public區域宣告」。這個錯誤通常是因為建構函式的存取權限修飾符錯誤所引起的。在C++中,類別的成員變數和成員函數都有一個存取權限修飾符,包括public、private和protected。

什麼是構造函數?詳解JavaScript中的建構函數 什麼是構造函數?詳解JavaScript中的建構函數 Aug 04, 2022 pm 03:22 PM

作為原型和原型鏈的基礎,先了解清楚構造函數以及它的執行過程才能更好地幫助我們學習原型和原型鏈的知識。這篇文章帶大家詳細了解JavaScript中的建構函數,介紹一下怎麼利用建構函數來建立一個js對象,希望對大家有幫助!

C++語法錯誤:只有單一參數的建構子必須宣告為explicit,要怎麼解決? C++語法錯誤:只有單一參數的建構子必須宣告為explicit,要怎麼解決? Aug 22, 2023 am 09:01 AM

在C++程式設計中,可能會遇到以下錯誤提示:只有單一參數的建構子必須宣告為explicit。這個錯誤提示可能會讓初學者感到疑惑,接下來,我們來了解一下在C++中什麼是explicit,以及該錯誤提示出現的原因以及如何解決這個問題。 explicit的作用在C++中,如果我們定義了一個只接收一個參數的建構函數,那麼我們就需要使用關鍵字explici

聊聊JavaScript中怎麼利用Object()函數來建立對象 聊聊JavaScript中怎麼利用Object()函數來建立對象 Aug 04, 2022 pm 04:32 PM

怎麼利用Object()函數創建物件?以下這篇文章為大家介紹一下Object()建構函式建立物件的方法(附其他三種建立物件的方法),希望對大家有幫助!

See all articles