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 で CSS 変数を使用する方法

JS で CSS 変数を使用する方法:export キーワードを使用して、js オブジェクトを le...

CSS3 アドバンス LESS で星空アニメーションを実装するサンプルコード

この記事では、星空アニメーションを実現するための高度な CSS3 LESS のサンプルコードを次のよ...

プロジェクトにおける CSS グリッドシステムの柔軟な使用方法の詳細な説明

序文CSS グリッドは通常、さまざまなフレームワークにバンドルされていますが、実際のビジネス ニーズ...

CentOS 7 に PHP5 用の suPHP をインストールする方法 (Peng Ge)

デフォルトでは、CentOS 7 上の PHP は apache または nobody として実行さ...

キャンバスをベースにした超クールな水光効果を実現

この記事の例では、キャンバスをベースにした超クールな水の光の効果を実装するための具体的なコードを参考...

MySQLクエリ条件のnot inとinの違いと理由

まずSQLを書く SELECT DISTINCT from_id タラから cod.from_id ...

MySql のクラッシュとサービスの起動失敗の解決策

私は長い間PHPに触れてきましたが、インストール環境は非常に不慣れです。多くの問題に遭遇しました。B...

SCSS スタイルのコードを 50% 削減する 14 の実践的な経験

序文Sass は CSS3 言語の拡張機能です。Sass を使用すると、より良いスタイルシートをより...

MySQL アーキテクチャのナレッジポイントの概要

1. データベースとデータベースインスタンスMySQL の研究では、データベースとデータベース イン...

Ubuntu 18.04にPython仮想環境をインストールする

Ubuntu 18.04 を使用する Python 開発者向けの参考資料です。 1. Ubuntu ...

Vmvare 仮想マシンを使用して Ubuntu のルート ディレクトリをパーティション分割する方法の紹介

目次序文根拠手順1. CDから仮想マシンを起動する2. GPartedツールを使用してパーティション...

MySQLの認可コマンド grant の使い方のまとめ

MySQL 認証コマンド grant の使用方法:この記事の例は MySQL 5.0 以降で実行され...

Vue の新しいパートナー TypeScript クイックスタート実践記録

目次1. 公式の足場を使って構築する2. プロジェクトディレクトリ分析3. TypeScript の...

CentOS 8 Zabbix 4.4 インストール ガイド

Zabbix サーバー環境プラットフォームZABBIX バージョン 4.4セントOS8 MySQL ...

LinuxにNginxをインストールする詳細な手順

1. Nginxのインストール手順1.1 公式サイトの紹介http://nginx.org/en/d...