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 をインストールする方法

推薦する

画像の半透明処理 画像と半透明の背景の実装のアイデアとコード

コードをコピーコードは次のとおりです。 <!DOCTYPE html PUBLIC "...

JavaScript のクロージャの問題の詳細な説明

クロージャは、純粋関数型プログラミング言語の伝統的な機能の 1 つです。クロージャをコア言語構造の不...

HTML 9グリッドレイアウトの実装方法

ウェブサイトのレイアウトの多様化は、当社のフロントエンドの得意分野です。最近、UC ブラウザのデフォ...

Centos7 で NIS を構成する詳細な手順

目次原理ネットワーク環境の準備インストール前の準備NIS サーバー操作NIS クライアント操作原理N...

Linux でタスク用のカスタム システム トレイ インジケーターを作成する

システム トレイ アイコンは、今日でも魔法のような機能です。アイコンを右クリックして目的のアクション...

IDEA2021 tomcat10 サーブレットの新しいバージョンの落とし穴

私が学習していたときに使用していたバージョンは比較的新しいものであり、インターネット上のチュートリア...

HTML テーブルタグチュートリアル (46): テーブルフッタータグ

<tfoot> タグは、テーブル フッターのスタイルを定義するために使用されます。基本構...

CSS属性のマージンの理解について話す

1.マージンとは何ですか?マージンは、要素の周囲のスペースの間隔を制御するために使用され、視覚的にス...

MySQLログシステムの使い方に関する簡単なチュートリアル

目次序文1. エラーログ2. バイナリログ1. バイナリログを有効にする2. バイナリログ形式3. ...

Vue のクロスドメイン問題の処理と解決策の概要

ネットワークリクエストを送信すると、次の保存情報が表示されます。おめでとうございます。ドメインを越え...

Vueバスの簡単な使い方

Vueバスの簡単な使い方シナリオの説明:コンポーネント A にはコンポーネント B と C が含まれ...

レスポンシブウェブデザインを実現するためにIEでCSS3メディアクエリをサポートする

今日の画面解像度は、320 ピクセル (iPhone) ほど小さいものから、2560 ピクセル以上 ...

WeChat アプレット uniapp は左スワイプによる削除効果を実現します (完全なコード)

WeChatアプレットuniappは左スワイプで削除効果を実現成果を達成する1. スワイプしてリス...

MySQL CHARとVARCHARの選択方法

目次VARCHAR 型と CHAR 型結論: VARCHAR 型と CHAR 型VARCHAR と ...