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を使用してボタンホバーフラッシュダイナミック特殊効果コードを実装する

推薦する

Viteは仮想ファイルの実装を導入します

目次背景仮想ファイルのインポート例書類タイプスクリプトのサポート要約する背景新しいプロジェクトで v...

Vue の高度な使用方法チュートリアル 動的コンポーネント

目次基本的な説明AST 解析レンダリング機能通常コンポーネントと動的コンポーネントの比較ファクトリ関...

Vue の nextTick について話す

データが変更されても、DOM ビューはすぐには更新されません。変更直後にノードまたはその値を取得しよ...

さまざまなHTTPリターンステータスコードの詳細な説明

サイト上のページを表示するためのリクエストがサーバーに送信されると(たとえば、ユーザーがブラウザでペ...

docker を使用してコード サーバーをデプロイする方法

画像をプルする # docker pull codercom/code-server # Docke...

Linux の vsftpd サービス構成の簡単な分析 (匿名、ユーザー、仮想ユーザー)

vsftpd の概要vsftpd は「very secure FTP daemon」の略称で、セキ...

Mac+IDEA+Tomcat の設定手順

目次1. ダウンロード2. インストールと解凍3. Tomcatを起動する4番目に、インストールが成...

MySQL データベースの詳細な説明 - 複数テーブル クエリ - 内部結合、外部結合、サブクエリ、相関サブクエリ

複数テーブルクエリ複数のテーブルから関連するクエリ結果を取得するには、単一の SELECT ステート...

MySQL btree インデックスとハッシュ インデックスの違い

MySQL では、ほとんどのインデックス (PRIMARY KEY、UNIQUE、INDEX、FUL...

MySQLにおけるビューの作成(CREATE VIEW)と使用制限の詳しい説明

この記事では、例を使用して、MySQL ビューの作成 (CREATE VIEW) と使用上の制限につ...

MySQLで一意のサーバーIDを生成する方法

序文MySQL では、server-id を使用してデータベース インスタンスを一意に識別し、それを...

MySQL ストアド プロシージャの作成と呼び出しの詳細な説明

目次序文ストアドプロシージャ: 1. ストアドプロシージャの作成と呼び出し1. ストアドプロシージャ...

k8sとDockerの関係についての簡単な説明

最近、プロジェクトでは kubernetes (以下、k8s と表記、k と s の間には 8 つの...

srcまたはcss背景画像のurl値はbase64でエンコードされたコードです

ウェブ上の一部の画像の src または CSS 背景画像 URL の後に、data:image/pn...

MySQL テーブルにはどのくらいの量のデータを保存できますか?

プログラマーは MySQL を扱う機会が多く、毎日触れているとも言えますが、MySQL テーブルには...