JavaScriptプロトタイプチェーンを理解する

JavaScriptプロトタイプチェーンを理解する

この記事を読むと、プロトタイプとプロトタイプ チェーンがとてもシンプルであることがわかります。 上記の古典的なプロトタイプチェーン等式図は、次の学習に従って簡単に習得できます。

1. プロトタイプとプロトタイプチェーンの平等関係を理解する

まず、次の 2 つの概念を明確に理解する必要があります。

jsは関数オブジェクトと通常のオブジェクトに分かれています。各オブジェクトには__proto__属性がありますが、関数オブジェクトのみがprototype属性を持ちます。
ObjectFunction js の組み込み関数です。よく使用される同様の関数には、 ArrayRegExpDateBooleanNumberStringなどがあります。

これら 2 つの概念を私と一緒に 3 回読んで覚えてください。後で使用します。

では、 __proto__prototypeとは何でしょうか?2つの概念で理解してみましょう。

  • 属性__proto__は、 constructor__proto__という 2 つの属性を持つオブジェクトです。
  • プロトタイプ オブジェクトprototypeは、どのコンストラクターがインスタンスを作成したかを記録するために使用されるデフォルトのconstructorプロパティがあります。

これら 2 つの概念を私と一緒に 3 回読んで覚えてください。後で使用します。

次のコンストラクタPersonがあり、そのプロトタイプには国属性motherland='China'があります。

 関数 Person(名前, 年齢){ 
    this.name = 名前;
    this.age = 年齢;
 }
 
 Person.prototype.motherland = '中国'

person01インスタンスはnew Person()によって作成されました

 person01 = new Person('Xiaoming', 18); とします。

js の父は、js プロトタイプとプロトタイプ チェーンを設計する際に、次の 2 つの原則に従いました。

 Person.prototype.constructor == Person // **ガイドライン 1: プロトタイプ オブジェクトのコンストラクター (つまり、Person.prototype) は、コンストラクター自体を指します**
 person01.__proto__ == Person.prototype // **ガイドライン 2: インスタンス (つまり person01) の __proto__ とプロトタイプ オブジェクトは同じ場所を指します**

これら 2 つのルールを私と一緒に 3 回読んで覚えておいてください。これらは後で使用されます。

上記の4 つの概念と 2 つの基準を覚えておけば、どのプロトタイプ チェーンの等価性判断も正しいものになります。

概念と基準を理解したかどうかは、上の図で確認できます。必ず上の図を確認してください。

// この古典的なグラフを上から分析し始めます function Foo() function Foo()
f1 = new Foo() とします。
f2 = new Foo() とします。

f1.__proto__ = Foo.prototype; // ルール2
f2.__proto__ = Foo.prototype; // ルール2
Foo.prototype.__proto__ = Object.prototype; // ルール 2 (Foo.prototype も共通オブジェクトなので、ルール 2 が適用されます)
Object.prototype.__proto__ = null; // プロトタイプチェーンはここで停止します Foo.prototype.constructor = Foo; // ルール 1
Foo.__proto__ = Function.prototype; // ルール 2
Function.prototype.__proto__ = Object.prototype; // 原則 2 (Function.prototype は基本的に共通オブジェクトなので、原則 2 が適用されます)
Object.prototype.__proto__ = null; // プロトタイプチェーンはここで停止します // **ここで Foo と Function の違いに注意してください。Foo は Function のインスタンスです**

// この古典的なグラフの分析を真ん中から開始します Function Object() Function Object()
o1 = 新しいオブジェクト();
o2 = 新しいオブジェクト();

o1.__proto__ = Object.prototype; // ルール 2
o2.__proto__ = Object.prototype; // ルール 2
Object.prototype.__proto__ = null; // プロトタイプチェーンはここで停止します Object.prototype.constructor = Object; // ルール 1
Object.__proto__ = Function.prototype // 原則 2 (オブジェクトは本質的に関数です);
// これは少し混乱します。Object は本質的に関数であり、Function は本質的にオブジェクトです。Function.prototype.__proto__ = Object.prototype; // ルール 2 (Function.prototype も通常のオブジェクトなので、ルール 2 が適用されます)
Object.prototype.__proto__ = null; // プロトタイプチェーンはここで停止します // 以下の Function Function() からこの古典的な図の分析を開始します Function Function()
Function.__proto__ = Function.prototype // ルール 2
Function.prototype.constructor = Function; // ルール 1



このことから、 __proto__nullを指しているObjectのプロトタイプ オブジェクト ( Object.prototype ) を除いて、他の組み込み関数オブジェクトのプロトタイプ オブジェクト (例: Array.prototype) とカスタム コンストラクターの__proto__すべてObject.prototypeを指していることがわかります。これは、プロトタイプ オブジェクト自体が通常のオブジェクトであるためです。今すぐ:

Object.prototype.__proto__ = null;
Array.prototype.__proto__ = Object.prototype;
Foo.prototype.__proto__ = Object.prototype;

2: プロトタイプとプロトタイプ チェーンとは何を意味しますか?

これらの対等な関係を理解し​​た上で、プロトタイプとプロトタイプチェーンが何を意味するのか考えてみましょう。プロトタイプ オブジェクトの機能は、すべてのインスタンスに共通するプロパティとメソッドを格納することであり、これによりメモリ消費を大幅に削減できます。

記事の冒頭にあるPersonコンストラクターと person01 インスタンスを例に挙げます。

コンソールログ(person01)


person01を印刷すると、彼は自身の属性 name = 'Xiaoming'、age = 18 を持ちます。同時に、プロトタイプ チェーン関係を通じて、彼は属性 motherland = 'China' を持ちます。

person2インスタンスを作成しましょう

person02 = new Person('Xiaohua', 20); とします。
コンソールログ(person02)

person02を印刷すると、独自の属性 name = 'Xiaohua'、age = 20 があります。同時に、プロトタイプ チェーン関係を通じて、属性motherland = 'China'があります。プロトタイプ オブジェクトには、 person01person02で共有される属性motherland = 'China'格納されていることがわかります。各インスタンスに motherland 属性を追加する必要はありませんが、この属性を、人間の Person のコンストラクターのコンストラクター プロトタイプ オブジェクトに格納します。同じ特性やメソッドはたくさんあります。たとえば、私たちは皆、黒い髪をしていますし、食べることや寝ることなどのメソッドも持っています。同じ特性やメソッドが多ければ多いほど、プロトタイプとプロトタイプ チェーンの重要性は高まります。 こうすればいい

Person.prototype.hairColor = 'black';
Person.prototype.eat = 関数(){
    console.log('私たちは通常、1日に3食食べます。')
}
コンソールログ(person01)
コンソールログ(person02)

このとき、 person01person02再度印刷すると、これらにhairColor属性とeatメソッドがあることに驚きます。インスタンスは、 Personコンストラクターの後に追加された属性とメソッドを動的に取得します。これがプロトタイプとプロトタイプ チェーンの意味です。動的に取得できるため、メモリを節約できます。

もう一つ注目すべき点は、 person01 が髪を黄色に染めた場合、 hairColorどうなるかということです。

person01、髪の色 = '黄色';
コンソールログ(person01)
コンソールログ(person02)

person01hairColor = 'yellow'person02hairColor = 'black'であることがわかります。インスタンス オブジェクトはプロトタイプから継承された属性とメソッドをオーバーライドします。これは、「プロパティの上書きとプロパティのシールド」に相当します。この操作では、プロトタイプのプロパティとメソッドは変更されず、当然、統合コンストラクターによって作成された他のインスタンスも変更されません。プロトタイプ オブジェクトのプロパティとメソッドを変更することによってのみ、プロトタイプ チェーンを通じて他のインスタンスによって取得されたプロパティとメソッドを変更できます。

JS プロトタイプ プロトタイプ チェーンの理解に関するこの記事はこれで終わりです。より関連性の高い JS プロトタイプ プロトタイプ チェーンのコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM を応援していただければ幸いです。

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

<<:  MySQL 8.0 のインデックス スキップ スキャン

>>:  Linux Centos でスクリプトを使用して Docker をインストールする方法

推薦する

jsでの位置計算を徹底的に理解するのに役立つ記事

目次導入スクロール要素.スクロール()要素.scrollHeight/scrollWidth要素.s...

MySQL のロックの仕組みと使用法の分析

この記事では、例を使用して MySQL のロック メカニズムと使用方法を説明します。ご参考までに、詳...

vite2.0+vue3 モバイルプロジェクトの詳細な説明

1. 関連する技術的なポイントバイト版ヴュー3 ts統合ルーティングvuexを統合するAxiosを統...

GoのDockerデプロイメント用の基本イメージ2つの実装

1. golang:最新のベースイメージ mkdir gotest タッチメイン.go Docker...

JavaScript での HTML キャンバスとページ ストレージ テクノロジの使用に関する詳細な説明

目次1. JavaScriptはHTMLでキャンバスを使用する2. ページストレージ技術1. Jav...

CSSを使用してすべての子要素を選択する方法の詳細な説明

CSS を使用してすべての子要素を再帰的に選択するにはどうすればよいですか?以下の記事では、CSS ...

CSS 画像アニメーション効果のサンプルコード(フォトフレーム)

この記事では、CSS 画像アニメーション効果(フォトフレーム)のサンプルコードを紹介し、皆さんと共有...

Vueはページdivボックスのドラッグアンドドロップソート機能を実装します

vue は、ページ上の div ボックスのドラッグ アンド ドロップ ソート機能を実装します。 序文...

HTML4.0 要素のデフォルトスタイルの配置

コードをコピーコードは次のとおりです。 html、アドレス、引用ブロック、本文、dd、div、 dl...

MySQL 起動失敗の問題とシナリオ分析

1. ワンストップソリューション1. 問題の分析と特定 # MySQL設定ファイルを見つけて、MyS...

MySQL パーティションテーブルの正しい使用方法

MySQL パーティションテーブルの概要数億、あるいは数十億ものレコードを格納するテーブルに遭遇する...

JavaでTomcatサーバーを起動/停止する方法

1. プロジェクト構造 2.Tomcat.javaを呼び出す パッケージ com.calltomca...

Dockerボリュームのファイルマッピング方法

背景ブロックチェーン ログ モジュールで作業しているときに、コンテナーが実行されている場合は、ログ ...

CSS3 クリックボタン円形進行ティック効果実装コード

目次8. CSS3 クリックボタンの円形進捗チェック効果8.1 画像プレビュー8.2 index.h...