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

推薦する

Vueコンポーネント間の通信の非常に詳細な要約

目次序文1. Props、$emit一方向データフロー2. $親、$子3. $attrs、$list...

CSS3ダイヤモンドパズルはdivのみを回転し、背景画像は回転しない機能を実現します

需要背景プロジェクトはVueを使用して作成され、ビジネス要件にはパズル効果があります。デフォルトの背...

CSSの絶対と相対について

冒頭にこう書かれています:アブソリュートは言った。「親戚よ、私はあなたを私の人生で見たくない!」なぜ...

MySQLのインデックスシステムがB+ツリーを使用する理由の分析

目次1. インデックスとは何ですか? 2. インデックスはなぜ必要なのでしょうか? 3. インデック...

MySQL ページング分析の原理と効率改善

MySQL ページング分析の原理と効率改善PERCONA PERFORMANCE CONFERENC...

CSSを使用して複数の画像を中央に水平に表示する方法

まず実装手順について説明します。最終結果 2. コードの実装HTML部分 <div class...

Dockerでランナーコンテナを構成する方法

1. ランナーコンテナを作成する mk@mk-pc:~/Desktop$ docker run -d...

Windows での mysql-5.7.28 のダウンロード、インストール、および構成に関する詳細なグラフィックとテキストのチュートリアル

最近MySQLデータベースのバージョンを変更する必要があり、それを記録するために記事を書きます1. ...

MAC で MySQL のデフォルトの文字セットを utf8 に変更する方法

1. デフォルトでインストールされているMySQLの文字セットを確認するmysql> '...

MySQL 8.0.17 winx64 (Navicat 付き) 手動構成バージョンのインストール チュートリアル図

1. ダウンロードアドレス: mysql-8.0.17-winx64ダウンロードして解凍する2. フ...

vue3 を使用してマテリアル ライブラリを構築する方法

目次なぜマテリアルライブラリが必要なのでしょうか?材質は何ですか?素材の種類fuep、vue3 ベー...

iframe テクニックを使用して訪問者 QQ 実装のアイデアとサンプル コードを取得する

今日、仕事中に、一時的に追加した友人から、Web ページを使用して訪問者の QQ を取得する方法を尋...

Win7x64でのMySQL 5.7.18解凍版のインストール方法

関連記事: Win7 x64 に解凍版の mysql 5.7.18 winx64 をインストールする...

HTMLタグの説明

HTMLタグの説明1. HTMLタグタグ: !DOCTYPE説明: HTML ドキュメントが準拠する...

Centos6.5 でのスーパーバイザーのアップグレード、インストール、および構成に関するチュートリアル

スーパーバイザー紹介Supervisor は、Python で開発されたクライアント/サーバー サー...