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 の順序なしリストタグと順序付きリストタグの使用例

推薦する

Dockerイメージの作成Dockerfileとコミット操作

イメージを構築するイメージを構築するには、主に 2 つの方法があります。実行中のコンテナをイメージに...

Vue 監視プロパティと計算プロパティ

目次1. 監視プロパティを監視する1. ショッピングカート2. すべて選択し、すべて選択解除する2....

Javascript で SessionStorage と LocalStorage を使用する方法

目次序文SessionStorage と LocalStorage の紹介SessionStorag...

HTML面接の質問の要約

1. doctypeの役割、厳密モードと混合モードの違い、そしてその重要性1. 構文形式: <...

Viteプロジェクトを作成する手順

目次序文yarn create は何をしますか?ソースコード分析プロジェクトの依存関係テンプレート構...

Linux環境にJDK1.8をインストールする

目次1. インストール環境2. インストール手順ステップ1: インストールパッケージをダウンロードす...

Dockerイメージをインポートおよびエクスポートする方法

この記事では、移行、バックアップ、アップグレードなどのシナリオで使用される Docker イメージの...

ミニプログラムの基本的な使用方法の知識ポイント(非常に包括的で、お勧めです!)

目次アプリを登録するときに何をすればよいですか?ページを登録するときに通常何をする必要がありますか?...

ネイティブ JS オブジェクト指向タイピング ゲーム

この記事では、JSオブジェクト指向タイピングゲームの具体的なコードを参考までに紹介します。具体的な内...

HTML+CSS+JS でスタックカルーセル効果を実装するサンプルコード

効果:スライドショーが一方向に動く場合、各画像のサイズ、位置、透明度、レベルを変更する必要があります...

etcd クラスターをデプロイするための docker-compose の実装手順

目次docker-compose.ymlを書くdocker-composeを実行するビルドステータス...

MySQLのテーブル構造を変更する際に知っておきたいメタデータロックの詳しい解説

序文MySQL を扱ったことがある人なら、テーブル メタデータ ロックの待機についてよく知っているは...

js における浅いコピーと深いコピーの詳細な説明

目次1. jsメモリ2. 譲渡3. 浅いコピー4. ディープコピー序文:以下の記事を読む前に、記憶に...

Nodeはkoa2を使用してシンプルなJWT認証方式を実装します

JWT の紹介JWTとは正式名称はJSON Web Tokenで、現在最も人気のあるクロスドメイン認...

WeChat アプレット ピッカー マルチ列セレクター (モード = multiSelector)

目次1. 効果図(複数列) 2. 通常セレクター: mode = selector、複数列セレクター...