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 における := と = の違いをグラフィカルに紹介

:= と = の違い=設定および更新の場合にのみ、:= と同じ効果、つまり代入効果があり、それ以外の...

UbuntuにProtobuf 3をインストールするための詳細なチュートリアル

いつインストールするかprotoc コマンドを使用しても Protoc が見つからない場合は、インス...

InnoDB タイプの MySql によるテーブル構造とデータの復元

前提条件: データベースを復元するために必要な .frm ファイルと .ibd ファイルを保存します...

MySQL での正規表現の使用に関する詳細

目次1. はじめに2. 製品テーブルを準備する2.1 ステートメントの順序2.2 大文字と小文字の区...

複雑なウェブサイトのナビゲーションを簡素化

<br />ナビゲーション設計は構造設計における主要なタスクの 1 つです。ソフトウェア...

MySQLのCOUNT(*)のパフォーマンスについてお話しましょう

序文基本的に、職場のプログラマーは、count(*)、count(1)、または count(prim...

Linux で Oracle データベースをバックアップするためのスケジュールされたタスクの設定に関するチュートリアル

1. データベースの文字セットを確認するデータベースの文字セットは、Linux で設定された環境変数...

Vue フロントエンド開発における階層的にネストされたコンポーネント間の通信の詳細な説明

目次序文例まとめ序文Vue の親子コンポーネントは、props を通じて親コンポーネントの値を子コン...

MySQL カーソルの定義と使用法

カーソルの作成まず、MySql でデータ テーブルを作成します。 存在しない場合はテーブルを作成 `...

Vue マウスホイールスクロール切り替えルーティング効果を実装する方法

ルート ルーティング コンポーネント (アプリの下のルート ルーティング コンポーネント。子コンポー...

キープアライブキャッシュをクリアする方法の詳細なグラフィック説明

目次オープニングシーンv-for を使用した直接レンダリングカスタムコンポーネントで直接レンダリング...

役に立つメタ設定方法(必読)

<meta name="viewport" content="...

HTML テーブル セルの幅と高さを設定する方法

Web ページを作成するときに、テーブルの幅が揃っていないという問題に遭遇することがよくあります。 ...

IDEA が MySQL ポート番号占有に接続できない問題の解決方法

コマンドラインでMYSQLに正常にログインでき、NavicatもMySQLに正常に接続できますが、I...

Mysql テーブルコメントフィールド取得操作

余計なことは言わないで、コードだけ見てみましょう〜 -- テーブル内のフィールドコメントを表示および...