js プロトタイプとプロトタイプ チェーンは次のとおりです。 1. プロトタイプ、すべての関數(shù)はデフォルトで「プロトタイプ」のようなパブリックで列挙不可能な屬性を持ち、これは別のオブジェクト (プロトタイプ) を指します。 2. プロトタイプ チェーン: オブジェクトのプロパティまたはメソッドにアクセスするとき、オブジェクトはまずそれ自體からそれを探します。見つからない場合は、プロトタイプ內(nèi)、つまりそのオブジェクトの「プロトタイプ」內(nèi)でそれを探します。プロトタイプで見つからない場合は、コンストラクターにそのような屬性がなくても、プロトタイプの後ろにあるプロトタイプでそれを探し、プロトタイプ チェーンと呼ばれるチェーン構造を形成します。
このチュートリアルのオペレーティング システム: Windows 10 システム、JavaScript ECMAScript 2021 バージョン、DELL G3 コンピューター。
1. プロトタイプ
プロトタイプ: すべての関數(shù)には、デフォルトで「プロトタイプ」のようなパブリックで列挙不可能な屬性があり、別のオブジェクトを指します。このオブジェクトはプロトタイプです。オブジェクト (関數(shù)もオブジェクト) が定義されるたびに、暗黙的プロトタイプと呼ばれる __proto__ 屬性が生成されます。この __proto__ 屬性は、このオブジェクトのコンストラクターのプロトタイプ (明示的プロトタイプと呼ばれます) を指します。すべてのオブジェクトはプロトタイプからプロパティを「継承」します。
最初に例を見て、Student クラスを作成し、クラスのインスタンス オブジェクト Student を作成します。
class Student{ constructor(name, score) { this.name = name; this.score = score; } introduce() { console.log(`我是${this.name},考了${this.score}分。`) } } const student = new Student('張三', 99) console.log('student', student); // student Student { name: '張三', score: 99} student.introduce(); // 我是張三,考了99分。
コンソールはプロパティとメソッドにアクセスできます。
しかし、コンソールに直接 Student と入力すると、名前とスコア屬性のみがあり、導入メソッドはありませんが、[[プロトタイプ]] があることがわかります。屬性。2 つの角かっこを使用します。
[[プロトタイプ]] を展開すると、導入メソッドが [[プロトタイプ]] にあることがわかります。
[[Prototype]] 屬性は、Student オブジェクトの暗黙的なプロトタイプと呼ばれます。オブジェクトのプロパティやメソッドを見つけたいとき、現(xiàn)在のオブジェクトで見つからない場合は、現(xiàn)在のオブジェクトの暗黙のプロトタイプ [[Prototype]] 屬性にアクセスしてそれらを見つけます。
プロトタイプには、.__proto__ 屬性を通じてアクセスできます。__proto__ の両側に 2 つのアンダースコアがあることに注意してください。
Student() コンストラクターには、prototype 屬性もあります。Student() コンストラクターのプロトタイプ屬性は、実際には Student オブジェクトの __proto__ 屬性と同じです。
以下は説明するための図です:
したがって、コンストラクターのプロトタイプ屬性は、インスタンス オブジェクトの __proto__ 屬性、コンストラクターのプロトタイプ屬性は明示的プロトタイプと呼ばれ、インスタンス オブジェクトの __proto__ 屬性は暗黙的プロトタイプと呼ばれます。
2. プロトタイプ チェーン
プロトタイプ チェーン: オブジェクトのプロパティまたはメソッドにアクセスするとき、オブジェクトはまずそれを自分自身から探します。見つからない場合は、プロトタイプ、つまりコンストラクターのプロトタイプである __proto__ でそれを検索します。プロトタイプで見つからない場合、つまり、コンストラクターにそのような屬性がありません。コンストラクターもオブジェクトであり、__proto__ も持っている場合、プロトタイプを検索します。このプロトタイプは、プロトタイプ チェーンと呼ばれるチェーン構造を形成します。プロトタイプ チェーンは、本質(zhì)的にオブジェクトの継承関係を記述します。
別の例を見てみましょう。パーソン クラスを作成し、そのパーソン クラスを継承する Teacher クラスを作成し、インスタンス オブジェクト Teacher を作成します。
class Person { constructor(name) { this.name = name; } drink(){ console.log('喝水'); } } class Teacher extends Person { constructor(name, subject) { super(name); this.subject = subject; } teach() { console.log(`我是${this.name}, 教${this.subject}。`) } } const teacher = new Teacher('哈默', '前端開發(fā)') console.log('teacher', teacher); teacher.teach(); teacher.drink();
コンソールの出力は次のとおりです。が続き、教師は、teach() メソッドと Drink() メソッドを?qū)g行できます。
Teacher オブジェクトを展開すると、これら 2 つのメソッドが見つからないことがわかりました。そのため、オブジェクトのプロトタイプ、つまり __proto__ 屬性を探し、teach( ) メソッドを展開して、__proto__ 屬性のレイヤーで、 Drink() メソッドを見つけます。
次は説明のための図です:
可以看到,teacher實例對象本身是沒有teach()方法的,這時就會去teacher對象的__proto__隱式原型指向的Teacher.prototype顯式原型上去找,此時找到了teach()方法并執(zhí)行;同時,Teacher.prototype上仍然沒有找到drink()方法,而Teacher.prototype也是一個對象,有自己的__proto__隱式原型,那么就去Teacher.prototype.__proto__上去找,Teacher.prototype.__proto__會指向Person()構造函數(shù)的顯式原型Person.prototype,此時找到了drink()方法并執(zhí)行,這就是原型鏈。
注:
(1)通過__proto__形成原型鏈而非protrotype。
(2)__proto__屬性是對象所獨有的。
(3)prototype屬性是函數(shù)所獨有的。但是由于JS中函數(shù)也是一種對象,所以函數(shù)也擁有__proto__屬性。
三、判斷對象自身是否有某屬性或方法
hasOwnProperty()方法會返回一個布爾值,用于判斷對象自身是否有某屬性或方法。返回true,代表是該對象自身的屬性或方法;返回false,代表是該對象原型上的屬性或方法。
由于Person類繼承自Object類,那么執(zhí)行teacher.hasOwnProperty()方法時,實際會找到Object.prototype中的hasOwnProperty()方法并執(zhí)行。
因此,所有繼承了Object的對象都會繼承到hasOwnProperty方法。
同時可以看到,Object.prototype.__proto__ 的值為 null ,即 Object.prototype 沒有原型,所以可以想象在原型鏈中,當找到頂層原型還沒有屬性時,那就是沒有這個屬性,返回返回undefined。
instanceof 運算符:用于檢測構造函數(shù)的 prototype 屬性是否出現(xiàn)在某個實例對象的原型鏈上。
看一個例子,使用typeof判斷array的數(shù)據(jù)類型時,返回的是object,因此無法使用typeof判斷array的類型。
const object = {}; const array = []; // 使用typeof判斷數(shù)據(jù)類型,array返回的是object console.log(typeof object); // object console.log(typeof array); // object
下面使用instanceof運算符判斷array的數(shù)據(jù)類型:
// 使用instanceof判斷數(shù)據(jù)類型 const flagObject = object instanceof Array; const flagArray = array instanceof Array; console.log(flagObject); // false console.log(flagArray); // true
object instanceof Array返回false,表示Array.prototype不在object的原型鏈上;array instanceof Array返回true,表示Array.prototype在array的原型鏈上,由此可以區(qū)分object和array的數(shù)據(jù)類型。
也可通過控制臺查看object和array的原型。
注:[] instanceof Object 為 true
以上がjsプロトタイプとプロトタイプチェーンとは何ですかの詳細內(nèi)容です。詳細については、PHP 中國語 Web サイトの他の関連記事を參照してください。

ホットAIツール

Undress AI Tool
脫衣畫像を無料で

Undresser.AI Undress
リアルなヌード寫真を作成する AI 搭載アプリ

AI Clothes Remover
寫真から衣服を削除するオンライン AI ツール。

Stock Market GPT
AIを活用した投資調(diào)査により賢明な意思決定を?qū)g現(xiàn)

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中國語版
中國語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統(tǒng)合開発環(huán)境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

WebSocketとJavaScript:リアルタイム監(jiān)視システムを?qū)g現(xiàn)するためのキーテクノロジー はじめに: インターネット技術の急速な発展に伴い、リアルタイム監(jiān)視システムは様々な分野で広く利用されています。リアルタイム監(jiān)視を?qū)g現(xiàn)するための重要なテクノロジーの 1 つは、WebSocket と JavaScript の組み合わせです。この記事では、リアルタイム監(jiān)視システムにおける WebSocket と JavaScript のアプリケーションを紹介し、コード例を示し、その実裝原理を詳しく説明します。 1.WebSocketテクノロジー

WebSocket と JavaScript を使用してオンライン音聲認識システムを?qū)g裝する方法 はじめに: 技術の継続的な発展により、音聲認識技術は人工知能の分野の重要な部分になりました。 WebSocket と JavaScript をベースとしたオンライン音聲認識システムは、低遅延、リアルタイム、クロスプラットフォームという特徴があり、広く使用されるソリューションとなっています。この記事では、WebSocket と JavaScript を使用してオンライン音聲認識システムを?qū)g裝する方法を紹介します。

JavaScript と WebSocket: 効率的なリアルタイム天気予報システムの構築 はじめに: 今日、天気予報の精度は日常生活と意思決定にとって非常に重要です。テクノロジーの発展に伴い、リアルタイムで気象データを取得することで、より正確で信頼性の高い天気予報を提供できるようになりました。この記事では、JavaScript と WebSocket テクノロジを使用して効率的なリアルタイム天気予報システムを構築する方法を?qū)Wびます。この記事では、具體的なコード例を通じて実裝プロセスを説明します。私たちは

JavaScript チュートリアル: HTTP ステータス コードを取得する方法、特定のコード例が必要です 序文: Web 開発では、サーバーとのデータ対話が頻繁に発生します。サーバーと通信するとき、多くの場合、返された HTTP ステータス コードを取得して操作が成功したかどうかを判斷し、さまざまなステータス コードに基づいて対応する処理を?qū)g行する必要があります。この記事では、JavaScript を使用して HTTP ステータス コードを取得する方法を説明し、いくつかの実用的なコード例を示します。 XMLHttpRequestの使用

JavaScript で HTTP ステータス コードを取得する方法の紹介: フロントエンド開発では、バックエンド インターフェイスとの対話を処理する必要があることが多く、HTTP ステータス コードはその非常に重要な部分です。 HTTP ステータス コードを理解して取得すると、インターフェイスから返されたデータをより適切に処理できるようになります。この記事では、JavaScript を使用して HTTP ステータス コードを取得する方法と、具體的なコード例を紹介します。 1. HTTP ステータス コードとは何ですか? HTTP ステータス コードとは、ブラウザがサーバーへのリクエストを開始したときに、サービスが

JavaScript と WebSocket: 高性能のリアルタイム データ視覚化の作成 インターネットの急速な発展に伴い、リアルタイム データ視覚化は多くの分野でますます重要になっています。金融取引、物流や輸送、産業(yè)監(jiān)視やその他の分野であっても、リアルタイム データの視覚化は、データをより深く理解し、分析し、より多くの情報に基づいた意思決定を行うのに役立ちます。 Web 開発では、JavaScript と WebSocket テクノロジーを組み合わせて、高性能のリアルタイム データ視覚化を?qū)g現(xiàn)します。 W

JavaScript と WebSocket: 効率的なリアルタイム検索エンジンの構築 はじめに: インターネットの発展に伴い、ユーザーのリアルタイム検索エンジンに対する要求はますます高くなっています。従來の検索エンジンで検索を行う場合、ユーザーは検索ボタンをクリックする必要があり、リアルタイムの検索結果を求めるユーザーのニーズに応えることができませんでした。そのため、JavaScript と WebSocket テクノロジを使用してリアルタイム検索エンジンを?qū)g裝することが注目されています。この記事ではJavaScriptの使い方を詳しく紹介します。

WebSocket と JavaScript を使用してオンライン電子署名システムを?qū)g裝する方法の概要: デジタル時代の到來により、電子署名は従來の紙の署名に代わってさまざまな業(yè)界で広く使用されています。 WebSocketは全二重通信プロトコルとしてサーバーとリアルタイム雙方向のデータ通信が可能で、JavaScriptと組み合わせることでオンライン電子署名システムを?qū)g現(xiàn)できます。この記事では、WebSocket と JavaScript を使用して簡単なオンライン アプリケーションを開発する方法を紹介します。