JavaScript のプロトタイプとプロトタイプチェーンの詳細な説明

JavaScript のプロトタイプとプロトタイプチェーンの詳細な説明

プロトタイプチェーン図

ここに画像の説明を挿入

プロトタイピングに必須の知識

プロトタイプを理解するには、 __proto__prototype 、およびconstructor 3 つのプロパティを理解する必要があります。

1.__proto__ とコンストラクター属性はオブジェクトに固有です。

2. プロトタイププロパティは関数に固有です。

3. js では関数もオブジェクトの一種なので、関数には __proto__ とコンストラクターというプロパティもあります。

プロトタイプの 5 つのルール:

1. すべての参照型(オブジェクト、配列、関数)はオブジェクト特性を持ち、プロパティを自由に拡張できる。

2. すべての参照型(オブジェクト、配列、関数)には、通常のオブジェクトである__proto__(暗黙のプロトタイプ)属性があります。

3. すべての関数にはプロトタイプ(明示的なプロトタイプ)プロパティがあり、これも通常のオブジェクトです。

4. すべての参照型(オブジェクト、配列、関数)の__proto__値は、そのコンストラクタのプロトタイプを指します。

5. オブジェクトのプロパティを取得しようとするとき、変数自体にこのプロパティがない場合は、__proto__でそのプロパティを探します。

プロトタイププロパティ(プロトタイプを表示)

まずコンストラクタを作成する

var 親 = 関数(){
}
// 関数を定義します。これは単なる通常の関数です。var p1 = new Parent();
//キーワードnewにより、Parentはコンストラクタになります //Parentコンストラクタp1のインスタンスを作成します

prototypeは関数の固有のプロパティであり、これを通じてプロトタイプにアクセスできます。

prototypeもともと継承を実現するために設計されたもので、特定の関数によって作成されたすべてのインスタンスがプロパティとメソッドを共有できるようにしたり、特定のコンストラクターによってインスタンス化されたすべてのオブジェクトが共通のメソッドとプロパティを見つけることができるようにしたりします。 prototypeインスタンスごとに重複したプロパティ メソッドを作成する必要がありません。代わりに、コンストラクター関数のプロトタイプ オブジェクト (プロトタイプ) にプロパティ メソッドを作成します。共有する必要のないものはコンストラクターで作成されます。

Parentはコンストラクタ、Parent.prototypeはプロトタイプです

ここに画像の説明を挿入

Parent.prototypeに追加されたプロパティとメソッドはプロトタイプ プロパティとプロトタイプ メソッドと呼ばれ、コンストラクターのインスタンスはそれらにアクセスして呼び出すことができます。

proto プロパティ (暗黙のプロトタイプ)

__proto__ プロパティはオブジェクト (関数を含む) に固有です。

すべてのオブジェクトには、オブジェクトのプロトタイプ オブジェクトを指す __proto__ プロパティがあります。

p1.__proto__ === Parent.prototype; // true

__proto__ は通常、暗黙のプロトタイプと呼ばれ、prototype は通常、明示的なプロトタイプと呼ばれます。オブジェクトの暗黙のプロトタイプは、オブジェクトのコンストラクタの明示的なプロトタイプを指していると言えます。次に、明示的なプロトタイプで定義されたプロパティ メソッドが、暗黙的なプロトタイプを介してコンストラクターのインスタンスに渡されます。この方法により、インスタンスはコンストラクター プロトタイプのメソッドとプロパティに簡単にアクセスできます。

Parent.prototypeの暗黙のプロトタイプはオブジェクトプロトタイプを指します

Parent.prototype.__proto__ === Object.prototype; //true

ここに画像の説明を挿入

これにより、プロトタイプ チェーンの概念が導入されます。p1.toString p1.toString()が呼び出されると、最初に p1 オブジェクト自体が検索されます。見つからない場合は、p1.__proto__ を通じてプロトタイプ オブジェクトParent.prototypeが検索されます。見つからない場合は、 Parent.prototype.__proto__を通じて親プロトタイプ オブジェクト Object.prototype が検索されます。 toString メソッドはこのレイヤーにあります。 p1 が使用するメソッドを返します。

もちろん、 Object.prototype に見つからない場合はObject.prototype.__proto__で検索しますが、 Object.prototype.__proto__ === nullなので、 undefined が返されます。このため、オブジェクトの存在しないプロパティにアクセスすると、 undefined が返されます。

コンストラクタプロパティ

コンストラクター関数はプロトタイプを通じてプロトタイプにアクセスするため、プロトタイプも何らかの手段、つまりコンストラクターを通じてコン​​ストラクター関数にアクセスできる必要があります。

前の例と同様に、p1 はオブジェクトであり、p1 のコンストラクターは Parent() です。親のコンストラクタは Function() です

p1.コンストラクタ => f 親{}
Parent.constructor => f Function() { [ネイティブコード] }
Function.constructor => ƒ Function() { [ネイティブコード] }

関数はすべての関数のルート コンストラクターです。

この例から、p1 のconstructorプロパティが Parent を指していることがわかります。つまり、Parent は p1 のコンストラクターです。同様に、Parent のコンストラクター プロパティは Function を指しているため、Function は Parent のコンストラクターであり、Function がルート コンストラクターであることが検証されます。

ここに画像の説明を挿入

要約する

この記事はこれで終わりです。皆さんのお役に立てれば幸いです。また、123WORDPRESS.COM のその他のコンテンツにも注目していただければ幸いです。

以下もご興味があるかもしれません:
  • JavaScriptプロトタイプチェーンを理解する
  • JavaScript プロトタイプとプロトタイプチェーンの詳細
  • JavaScript プロトタイプとプロトタイプチェーンの深い理解
  • Javascript プロトタイプとプロトタイプチェーンをご存知ですか?
  • JavaScriptプロトタイプとプロトタイプチェーンの詳細な説明
  • JavaScript のプロトタイプとプロトタイプ チェーンを理解する

<<:  レイアウトサイズを変更するために左右にドラッグする純粋なCSS

>>:  HTML の順序なしリストタグと順序付きリストタグの使用例

推薦する

MySQL のグループ分けの例

mysql のような php switch case ステートメント。 xxフィールドを選択、ケース...

Linux デスクトップ用の 4 つのスキャン ツール

ペーパーレスの世界はまだ到来していませんが、書類や写真をスキャンすることで紙をなくす人が増えています...

モバイルデバイスにおける適応レイアウトの問題に関する簡単な説明 (レスポンシブ、rem/em、Js ダイナミクス)

3G の普及により、携帯電話を使ってインターネットにアクセスする人が増えています。モバイル デバイ...

MySQL 5.7.20 のインストールと設定方法のグラフィック チュートリアル (win10)

この記事では、MySQL 5.7.20のインストールと設定方法を参考までに紹介します。具体的な内容は...

MySQLはデフォルトのエンジンと文字セットの詳細を変更します

目次1. データベースエンジン1.1 ビューデータベースエンジン1.2 デフォルトのデータベースエン...

MySQL 8.0.22 winx64 のインストールと設定のグラフィックチュートリアル

mysql 8.0.22 winx64のインストールと設定のグラフィックチュートリアルは参考までに、...

Vue で変数式セレクターを実装する方法

目次HTML構造の定義入力タグのバインディング属性入力タグはキーダウンイベントをリッスンしますli ...

MySQL のデータ削除とデータ テーブル メソッドの例

MySQL でデータやテーブルを削除するのは非常に簡単ですが、削除するとすべてのデータが消えてしまう...

vue2 vue3 での Echarts の詳細な使用方法

目次1. インストール2. vue2でEchartsを使用するmain.jsファイル内コンテナが与え...

見落としがちなVue.jsのAPIを詳しく解説

目次次のチェックv-model 構文シュガー.sync 修飾子$セット計算プロパティセット要約する次...

負のマージントップ値は、ラベルテキストと入力の間の垂直中央揃えの問題を解決します。

ラベルテキストと入力の垂直方向の中央揃えを調整するのは簡単ではありません。padding、verti...

Docker 環境での Jmeter の分散操作に関する詳細なチュートリアル

1. jmeterの基本イメージを構築するDockerfile は次のとおりです。 # Java 8...

Ubuntu 18.04 での Pycharm インストール チュートリアルの実装

方法1: Pycharmをダウンロードしてインストールするダウンロードアドレス: https://w...

CentOS7で新しいデータディスクをマウントするための完全な手順

序文新しい VPS を購入しました。新しい VPS のデータ ディスクはデフォルトではシステムにマウ...

Dockerアーキテクチャ入門

Docker には 3 つの基本概念が含まれています。イメージ: Docker イメージはルート フ...