首頁 web前端 js教程 深入理解JavaScript是如何實現繼承的_javascript技巧

深入理解JavaScript是如何實現繼承的_javascript技巧

May 16, 2016 pm 05:09 PM
javascript 繼承

最近最網路上看了一個人面試淘寶時的經歷,然後發現了自己有很多好多不太清楚的地方,所以特此寫點文章來加深自己對一些問題的理解。

文章中提到了一個問題是:JavaScript是如何實現繼承的?

下面我便闡述一些在網路上找到的方法和實例來解釋下,藉以加深自己的印象。

我們知道JavaScript中的function是萬能的,除了用於的函數定義,也可以用於類別的定義。

JavaScript的繼承,說起來也是有點怪,不像C 和一些物件導向的語言,他沒有public,private等存取控制修飾,也沒有implement或其他特定的符號來說明是實作繼承。

關於javascript類別的繼承可以參考一下下面的這個例子。

複製代碼 代碼如下:





上例中,首先是聲明一個person類,裡麵包含了一些屬性和方法,然後接著又聲明了一個programmer類,其中有個base屬性,這個屬性並不是必需的,但是出於規範以及以後在尋找物件所繼承的類別時都需要寫上,然後是給programmer的原型物件(prototype)拷貝了person類別;於是便實現了類別的繼承。
模擬JavaScript中類別和繼承的一些原理

在物件導向的語言中,我們使用類別來建立一個自訂物件。然而JavaScript中所有事物都是對象,那麼用什麼辦法來建立自訂對象呢?

這就需要引入另一個概念- 原型(prototype),我們可以簡單的把prototype看做是一個模版,新創建的自定義對像都是這個模版(prototype)的一個拷貝(實際上不是拷貝而是鏈接,只不過這種鏈接是不可見,給人們的感覺好像是拷貝)。

讓我們來看看透過prototype建立自訂物件的範例:


複製程式碼

程式碼如下:// 建構子  function Person(name, sex) {
      this.name = name;
    原型,原型中的屬性可由自訂物件引用
  Person.prototype = {
      getName: function() {
       ex: function() {
          return this.sex;
      }
  }



這裡我們把函數Person稱為建構函數,也就是建立自訂物件的函數。可以看出,JavaScript透過建構函數和原型的方式模擬實現了類別的功能。

下面透過一個例子來具體闡述創建一個自訂對象,javascript所做的具體的工作:


複製程式碼

程式碼如下:

var zhang = new Person("ZhangSan", "man");console.log(zhang.getName()); // "ZhangSan"var chun = new Person("ChunHua", "woman");console.log(chun.getName()); // "ChunHua"

コード var zhang = new Person("ZhangSan", "man") が実行されると、実際に内部で次のことが行われます。

空のオブジェクト (new Object()) を作成します。
Person.prototype の属性 (キーと値のペア) をこの空のオブジェクトにコピーします (前述したように、内部実装はコピーではなく隠しリンクです)。
this キーワードを使用してこのオブジェクトをコンストラクターに渡し、コンストラクターを実行します。
このオブジェクトを変数 zhang に代入します。
すべての作業が完了しました。
プロトタイプ テンプレートがインスタンス化されたオブジェクトにコピーされるのではなく、リンクの方法であることを証明するには、次のコードを参照してください:

コードをコピー コードは次のとおりです。

function person(name, sex) {
this.name = name;
this.sex = sex;
}
person.prototype.age = 20;
var zhang = new Person("ZhangSan", "man");
console.log(zhang.age) // 20
; //
zhang.age = 19;
console.log(zhang.age) のプロトタイプを上書きします // 19
delete zhang.age;
// インスタンス属性を削除した後age、この属性値はプロトタイプから取得されます
console.log(zhang.age) // 20
;

上記の例では、コピーによってのみ取得された場合、age 属性を削除した後、オブジェクトは存在しません。ただし、この例の age 属性は引き続き出力または上書きできます。サブクラス内の同じ名前の属性が削除されただけで、親クラスの age 属性は非表示のリンクを介してオブジェクト内にまだ存在します。

JavaScript で単純な継承を実装するにはどうすればよいですか?

次の例では、従業員クラス Employee を作成します。これは、プロトタイプのすべてのプロパティを Person から継承します。

コードをコピーします コードは次のとおりです:

function Employee(name, sex,employeeID) {
this.name = name;
this.sex = sex;
this.employeeID =employeeID;
}
// Employee のプロトタイプが Person
のインスタンスを指すようにします。 // Employee の person インスタンスは person プロトタイプのメソッドを呼び出すことができるため、Employee のインスタンスは person プロトタイプのすべてのプロパティを呼び出すこともできます。
Employee.prototype = new Person();
Employee.prototype.getEmployeeID = function() {
return this.employeeID;
};
var zhang = new Employee("ZhangSan" , "man", "1234");
console.log(zhang.getName()); // "ZhangSan

わかりました。上記は JavaScript で継承を実装するためのいくつかの具体的なプロセスです。 、および継承を実装するメソッド。

もちろん、要約すると、JavaScript の継承メカニズムは一部のオブジェクト指向言語と比較すると、荒削りでいくつかの欠陥がありますが、それでもフロントエンドの開発が遅くなるわけではありません。この点に関する著者の熱意。

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡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)

熱門話題

Java教學
1664
14
CakePHP 教程
1423
52
Laravel 教程
1317
25
PHP教程
1268
29
C# 教程
1248
24
C++ 函式繼承詳解:如何在繼承中使用「基底類別指標」和「衍生類別指標」? C++ 函式繼承詳解:如何在繼承中使用「基底類別指標」和「衍生類別指標」? May 01, 2024 pm 10:27 PM

在函數繼承中,使用「基底類別指標」和「衍生類別指標」來理解繼承機制:基底類別指標指向派生類別物件時,執行向上轉型,只存取基底類別成員。派生類別指標指向基底類別物件時,執行向下轉型(不安全),必須謹慎使用。

C++ 函式繼承詳解:如何偵錯繼承中出現的錯誤? C++ 函式繼承詳解:如何偵錯繼承中出現的錯誤? May 02, 2024 am 09:54 AM

繼承錯誤調試技巧:確保正確的繼承關係。使用偵錯器逐步執行程式碼,檢查變數值。確保正確使用virtual修飾符。檢查隱藏的繼承帶來的菱形繼承問題。檢查抽象類別中未實現的純虛函數。

簡易JavaScript教學:取得HTTP狀態碼的方法 簡易JavaScript教學:取得HTTP狀態碼的方法 Jan 05, 2024 pm 06:08 PM

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

C++ 函式繼承詳解:如何理解繼承中的「is-a」與「has-a」關係? C++ 函式繼承詳解:如何理解繼承中的「is-a」與「has-a」關係? May 02, 2024 am 08:18 AM

C++函式繼承詳解:掌握「is-a」和「has-a」關係什麼是函式繼承?函數繼承是C++中一種將衍生類別中定義的方法與基底類別中定義的方法關聯起來的技術。它允許衍生類別存取和重寫基底類別的方法,從而擴展了基底類別的功能。 「is-a」和「has-a」關係在函數繼承中,「is-a」關係指派生類別是基底類別的子類型,也就是說,衍生類別「繼承」了基底類別的特性和行為。 「has-a」關係指派生類別包含對基底類別物件的參考或指針,也就是說,衍生類別「擁有」了基底類別物件。語法以下是如何實作函數繼承的語法:classDerivedClass:pu

如何在JavaScript中取得HTTP狀態碼的簡單方法 如何在JavaScript中取得HTTP狀態碼的簡單方法 Jan 05, 2024 pm 01:37 PM

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

C++ 中繼承和多態性如何影響類別的耦合度? C++ 中繼承和多態性如何影響類別的耦合度? Jun 05, 2024 pm 02:33 PM

繼承和多態性會影響類別的耦合度:繼承會增加耦合度,因為衍生類別依賴基底類別。多態性可以降低耦合度,因為物件可以透過虛擬函數和基底類別指標以一致的方式回應訊息。最佳實踐包括謹慎使用繼承、定義公共介面、避免在基底類別中新增資料成員,以及透過依賴注入解耦類別。實戰案例顯示如何使用多態性和依賴注入來降低銀行帳戶應用程式中的耦合度。

解釋self ::,parent ::和static :: in php oop中的區別。 解釋self ::,parent ::和static :: in php oop中的區別。 Apr 09, 2025 am 12:04 AM

在PHPOOP中,self::引用當前類,parent::引用父類,static::用於晚靜態綁定。 1.self::用於靜態方法和常量調用,但不支持晚靜態綁定。 2.parent::用於子類調用父類方法,無法訪問私有方法。 3.static::支持晚靜態綁定,適用於繼承和多態,但可能影響代碼可讀性。

'PHP物件導向程式設計入門:從概念到實踐” 'PHP物件導向程式設計入門:從概念到實踐” Feb 25, 2024 pm 09:04 PM

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

See all articles