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

推薦する

OpenSSL は双方向認証のチュートリアルを実装します (サーバーとクライアントのコード付き)

1. 背景1.1 問題点最近の製品テスト レポートでは、PKI ベースの認証方法の使用が推奨されて...

JavaScript を使用して QR コードを解析する 3 つの方法

目次1. JavaScriptを使用してQRコードを解析する1. QR コードとは何ですか? 2.q...

docker デプロイメントの実装手順 lnmp-wordpress

目次1. 実験環境2. Dockerソースをインストールする3. Dockerをインストールする4....

CSS 位置プロパティが絶対の場合のパーセンテージ値の計算

位置が絶対の場合、関連する属性のパーセンテージは、参照先の要素 (包含ブロック) を基準として計算さ...

MySQL 5.7 をインストールした後にコマンドライン ウィンドウを開くとクラッシュする問題の解決方法

序文最近、MySQL 5.7 をインストールしましたが、問題が見つかりました。コマンド ライン ウィ...

バックアップ データをインポートするときに innodb_index_stats がエラーを報告する場合の主キー競合の解決方法

障害の説明percona5.6、mysqldump フルバックアップ、バックアップデータのインポート...

Linux xargsコマンドの使用

1. 機能: xargs は、stdin 内のスペースまたは改行で区切られたデータをスペースで区切ら...

Node.js はクライアントリクエストデータ内の中国語文字化けの問題を解決します

Node.js はクライアントリクエストデータ内の中国語文字化けの問題を解決しますコード例: var...

MySQL の count 関数の正しい使い方の詳細な説明

1. 説明MySQLでは、テーブル内の行の総数を取得する必要がある場合、通常は次の文を使用します。 ...

MySQL が group by をサポートしない場合の解決策の概要

MySQL 5.7.x の最新バージョンをダウンロードしてインストールしました。デフォルトでは、on...

CSSを使用して特別なロゴやグラフィックを実装する

1. はじめに画像は多くのスペースを占め、画像の数が増えるほど管理が難しくなるため、シンプルなラベル...

MySQLでカーソルトリガーを使用する方法

カーソル選択クエリによって返される行のセットは、結果セットと呼ばれます。結果セット内の行は、入力した...

HTTPS の有効化に関する経験の共有

国内のネットワーク環境が悪化し続ける中、さまざまな改ざんや乗っ取りが後を絶たず、サイト全体をHTTP...

MySQL で distinct メソッドを使用する詳細な例

明確な意味: distinctive は、一意のレコードの数を照会するために使用されます。つまり、d...

yum を使用して rpm と関連する依存関係をダウンロードして、docker をオフラインでインストールします。

yum を使用してすべての依存関係を一緒にインストールできますが、–downloadonly –d...