JavaScriptプロトタイプと例の詳細な説明

JavaScriptプロトタイプと例の詳細な説明

コンストラクタインスタンスとプロトタイプの関係

1. あらゆる関数にはプロトタイププロパティがあり、これはオブジェクトである

関数F(){}
console.log(F.prototype) // => オブジェクト
//プロトタイプオブジェクト F.prototype.sayHi = function () {
  console.log('こんにちは!')
}

2. コンストラクターのプロトタイプ オブジェクトには、デフォルトでコンストラクター プロパティがあり、これはプロトタイプ オブジェクトが配置されている関数を指します。

console.log(F.constructor === F) // => true
//これを示します

3. コンストラクタを通じて取得されたインスタンスオブジェクトには、コンストラクタのプロトタイプオブジェクトへのポインタ_proto_が含まれます。

var インスタンス = 新しい F()
console.log(instance.__proto__ === F.prototype) // => true

これは、現在のコンストラクタによって作成されたインスタンスオブジェクトには、 _proto_というポインタが含まれており、このポインタはコンストラクタのプロトタイプオブジェクトを指していることを意味します。

したがって、インスタンスを使用してプロトタイプオブジェクトのメンバーに直接アクセスできます。

例:

instance.sayHi() // => hi! と印刷します。

知らせ

_proto_は非標準属性です

プロトタイププロパティ

Javascript では、すべてのコンストラクターに別のオブジェクトを指すプロトタイプ プロパティがあることが規定されています。
このオブジェクトのすべてのプロパティとメソッドは、コンストラクターのインスタンスによって継承されます。

つまり、すべてのオブジェクト インスタンスが共有する必要があるプロパティとメソッドをプロトタイプ オブジェクト上で直接定義できるということです。

例:

関数 Person (名前, 年齢) {
  this.name = 名前
  this.age = 年齢
}
console.log(Person.prototype) //プロトタイプを印刷します Person.prototype.type = 'human' //プロトタイプオブジェクトのプロパティにhumanをマウントします Person.prototype.sayName = function () { //関数を定義することもできます console.log(this.name)
}
p1 = new Person(...) とします。
p2 = new Person(...) とします。
console.log(p1.sayName === p2.sayName) // => true

console.log(p1.sayName === p2.sayName)で出力された結果が true であることがわかります。

これは、すべてのインスタンスのtype属性とsayName()メソッドが同じメモリ アドレスにあり、 prototypeオブジェクトを指しているため、実行効率が向上するためです。

属性またはメンバーの検索原則

複数のインスタンス オブジェクトがプロトタイプ オブジェクト内のプロパティまたはメンバーを共有できることはわかっていますが、この共有メカニズムは JS ではどのように実装されるのでしょうか。

これは属性の検索原理について言及する必要がある

コードがインスタンス オブジェクトのプロパティを読み取るたびに、指定された名前のプロパティまたはメンバーの検索が実行されます。

検索プロセスは次のとおりです。

1. オブジェクトインスタンス自体から検索を開始する

2. 指定された名前の属性がインスタンスオブジェクト内に見つかった場合、その属性の値が返されます。

3. 見つからない場合は、インスタンスオブジェクトに含まれるポインターが指すプロトタイプオブジェクトの検索を続行し(上記参照)、プロトタイプオブジェクト内で指定された名前の属性を探します。

4. このプロパティがプロトタイプオブジェクト内に見つかった場合、プロパティの値が返されます。

instance.sayName()を実行すると、インスタンス オブジェクトの最初の検索とプロトタイプ オブジェクトの検索の 2 つの検索が実行されます。

要約する

以上が、プロトタイプによってマウントされたプロパティとメソッドを複数のインスタンス オブジェクトが共有する基本原理です。

この記事はこれで終わりです。皆さんのお役に立てれば幸いです。また、123WORDPRESS.COM のその他のコンテンツにも注目していただければ幸いです。

以下もご興味があるかもしれません:
  • JavaScript プロトタイプチェーンを理解するための 2 つの図
  • JavaScript プロトタイプの詳細
  • JavaScriptプロトタイプチェーンの詳細な説明
  • JavaScript プロトタイプとプロトタイプチェーンの詳細
  • Javascript デザインパターン プロトタイプ モードの詳細
  • JavaScript プロトタイプとは何かご存知ですか?

<<:  MySQL グラフィカル管理ツール Navicat のインストール手順

>>:  CSS3を使用してボタンホバーフラッシュダイナミック特殊効果コードを実装する

推薦する

MySQL 5.7 に組み込まれているストレス テストの mysqlslap コマンドと構文の詳細な説明

序文mysqlslap は、MySQL サーバーへのクライアント負荷をシミュレートし、各ステージの時...

WeChatアプレットAmapマルチポイントルート計画プロセス例の詳細な説明

電話Amap API を呼び出す方法は? Amap が https://lbs.amap.com/a...

nginx + php の「入力ファイルが指定されていません」の解決策

本日、ローカル開発環境で突然「入力ファイルが指定されていません」というエラーが発生してしまいました。...

MySQL カーディナリティ統計の簡単な分析

1. カーディナリティとは何ですか?カーディナリティとは、MySQL テーブルの列内の異なる値の数を...

MySQL での Join の使用に関する詳細な説明

前の章では、1 つのテーブルからデータを読み取る方法を学習しました。これは比較的簡単ですが、実際のア...

UbuntuのVimにNERDTreeプラグインをインストールする詳細な手順

NERDTree は Vim 用のファイル システム ブラウザーです。このプラグインを使用すると、ユ...

UDP シンプル サーバー クライアント コード例

UDP の理論については詳しく説明しません。UDP に関する HelloWorld プログラムを紹介...

VMware vCenter の不正な任意ファイルアップロードの脆弱性 (CVE-2021-21972) について

背景CVE-2021-21972 VMware vCenter における認証されていないコマンド実行...

Docker可視化ツールPortainerの導入と中国語翻訳

#docker 検索#docker プルポーター1. イメージを取得した後、中国語パッケージをダウン...

Tomcat でのコネクタ構成

JBoss は Tomcat を Web コンテナとして使用するため、JBoss の Web コンテ...

mysql 解凍パッケージの基本インストールチュートリアル

新しいコンピューターに変更したので、すべての環境を新しいコンピューター上で設定する必要があります。ふ...

JavaScript にはすでに Object があるのに、なぜ Map が必要なのでしょうか?

目次1. オブジェクトをマップとして扱わない1. 未定義のプロパティはプロトタイプチェーンを通じてア...

Vue の better-scroll コンポーネントを使用して水平スクロール機能を実現する

について最近、Vue を学習する過程で、基本的な知識の練習と強化を目的として、Qunar.com の...

MySQL のストレージ エンジンの違いと比較

MyISAM ストレージエンジンMyISAM は ISAM ストレージ エンジンに基づいており、それ...

Web デザイン体験: 5 つの優れた Web デザイン コンセプトの完全分析 (画像)

他の種類のデザインとは異なり、Web デザインは時代の発展とともに常に変化しています。したがって、W...