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

推薦する

JavaScript で 24 以上の配列メソッドを手動で実装する

目次1. トラバーサルクラス1. 各2. 地図3. すべての4. いくつか5. フィルター6. 減ら...

1 分で Nginx のバージョンをスムーズにアップグレードおよびロールバックする方法

今日は、企業の実際の本番環境でよく遭遇する、Nginx を新しいバージョンにアップグレードし、古いバ...

Vue フロントエンドの Excel ファイルのエクスポートの詳細な実装計画

目次1. 技術の選択2. 技術的な実装vue-json-excelプラグインを使用して実装1. vu...

Vue で Axios 非同期リクエスト API を使用する方法

目次基本的なHTTPリクエストの設定async/await を使用した Axios Axios によ...

MySQL の結合クエリとサブクエリの問題

目次複数テーブル結合の基本構文クロス結合と直積現象クロスコネクトデカルト積現象内部結合外部結合左外部...

MySql クイック挿入数千万の大規模データの例

データ分析の分野では、データベースは私たちの強力な助けとなります。クエリ時間を受け入れるだけでなく、...

a タグをクリックして入力ファイルのアップロードダイアログボックスを表示する方法

htmlコードをコピーコードは次のとおりです。 <SPAN class=tag><...

さまざまなマウスの形状を表現する方法

<a href = "http://" style = "cur...

Vue はタブ ラベルを実装します (ラベルが自動スクロールを超える)

作成されたタブラベルがページの表示領域を超えると、タブラベルの距離だけ自動的にスクロールされます。ま...

Reactの状態管理の3つのルールのまとめ

目次序文No.1 焦点No.2 複雑な状態ロジックの抽出No.3 複数状態操作の抽出要約する序文Re...

Docker でタイムゾーンの問題に対処する方法

背景ここ 2 日間 Docker を使用していたところ、コンテナの起動後に date -R の出力タ...

CSS を使用して同じ親タグの左側と右側に 2 つのボタンを配置する方法

この記事では、主に同じ親タグの左側と右側にある 2 つのボタンの CSS レイアウト方法を紹介し、皆...

Windows Server 2019 のセットアップ方法 (画像とテキスト付き)

1. Windows Server 2019 のインストールVmware に Windows Se...

MySQL 5.7.25 圧縮版のインストールと設定方法のグラフィックチュートリアル

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

Centos7.3 で mysql5.7.18 をインストールして初期パスワードを変更する方法

この記事では、Centos7.3でのmysql5.7.18のインストールと初期パスワードの変更につい...