JavaScript の isPrototypeOf 関数

JavaScript の isPrototypeOf 関数

フレームワークのソース コードを見ると、 isPrototypeOf()関数に遭遇することがあります。この関数は何をするのでしょうか?

1. isPrototypeOf()

isPrototypeOf()は、 Object関数 (クラス) のメソッドで、現在のオブジェクトが別のオブジェクトのプロトタイプであるかどうかを判定するために使用されます。プロトタイプである場合はtrueを返し、そうでない場合はfalseを返します。

この機能を理解する鍵は、 JavaScriptの三大山の一つと言われているプロトタイプチェーンにあります。

ここでは原則を詳しく説明しません。簡単に言えば、次の 3 つのポイントがあります。

  • 1. 関数オブジェクトはprototypeプロパティを持って生まれます。
  • 2. すべてのオブジェクトは、それを生成する関数オブジェクトのprototypeを指すプロパティ__proto__を持って生成されます。
  • 3. 関数オブジェクトのprototypeそれを生成した関数オブジェクトのprototypeを指す__proto__もあります。

例 1、オブジェクト クラス インスタンス:

o = 新しいオブジェクト();
console.log(Object.prototype.isPrototypeOf(o)); // 真


oオブジェクトはObjectのインスタンスであるため、 o オブジェクトのプロトタイプ(__proto__)Objectのプロトタイプ ( prototype ) を指しており、上記では true が出力されます。

例 2: Human クラスを自分で定義します。

関数Human() {}
人間 = 新しいHuman();
 
console.log(Human.prototype.isPrototypeOf(human)); // 真


この例は前の例と似ています。 humanオブジェクトはHumanのインスタンスであるため、 humanオブジェクトのプロトタイプ(__proto__)Humanのプロトタイプ ( prototype ) を指しており、上記はtrueを出力します。

例 3: オブジェクトのプロトタイプが人間のプロトタイプであるかどうかを確認しましょう。

console.log(Object.prototype.isPrototypeOf(human)); // 真


なぜ?これはコードで説明した方がわかりやすいので、次の導出を参照してください。

// 人間のプロトタイプ (prototype) のプロトタイプ (__proto__) はオブジェクトのプロトタイプ (prototype) を指しているため
Human.prototype.__proto__ === Object.prototype
// そして、human (__proto__) のプロトタイプは Human (prototype) のプロトタイプを指しているので
huamn.__proto__ === 人間.プロトタイプ
// つまり、人間のオブジェクトのプロトタイプ (__proto__) は、オブジェクトのプロトタイプ (prototype) を指します。
huamn.__proto__.__proto__ === オブジェクト.prototype


人間の構造を見ると、これは簡単に理解できます。

では、 Objectprototypehumanのオブジェクトのプロトタイプなのでしょうか?正確に言うと、 Objectprototype humanのプロトタイプ チェーン上にあります。

例 4: Object.prototype が組み込みクラスのプロトタイプであるかどうか:

JavaScriptの組み込みクラスNumberStringBooleanFunctionArrayすべてObjectを継承するため、次の出力はすべてtrueなります。

console.log(Object.prototype.isPrototypeOf(Number)); // 真
console.log(Object.prototype.isPrototypeOf(String)); // 真
console.log(Object.prototype.isPrototypeOf(Boolean)); // 真
console.log(Object.prototype.isPrototypeOf(Array)); // 真
console.log(Object.prototype.isPrototypeOf(Function)); // 真


当然、 Object.prototype NumberStringBooleanFunctionArrayのインスタンスのプロトタイプでもあります。

例 5: オブジェクトは関数 (クラス) でもあります。

また、 Function.prototypeObjectのプロトタイプでもあることにも言及する価値があります。 Objectも関数 (クラス) であるため、それらはお互いを生成します。

次の出力を参照してください。

console.log(Object.prototype.isPrototypeOf(Function)); // 真
console.log(Function.prototype.isPrototypeOf(Object)); // 真

2. instanceofとの違い

instanceof 、オブジェクトがオブジェクトのインスタンスであるかどうかを判断するために使用されます。

例えば:

関数Human() {}
人間 = 新しいHuman();
 
// human は Human のインスタンスなので、出力は true になります
console.log(human instanceof Human); // true
 
// すべてのクラスがObjectを継承しているので、結果もtrueを出力します
console.log(human instanceof Object); // true
 
// 人間のオブジェクトは配列ではないため、結果の出力は false になります
console.log(human instanceof Array); // false


組み込みクラスの例をいくつか示します。

// [1,2,3]はArrayのインスタンスなので、出力はtrueになります
console.log([1, 2, 3] 配列のインスタンス); // true
 
// メソッドfunction(){}はFunctionのインスタンスなので、trueを出力します
console.log(function(){} 関数のインスタンス);


instanceofの原理は、クラスのプロトタイプ オブジェクト (プロトタイプ) がインスタンスのプロトタイプ チェーン内にあるかどうかを判断することです。一方、 isPrototypeOf 、クラスのプロトタイプ オブジェクト ( prototype ) がインスタンスのプロトタイプ チェーン上にあるかどうかを判断します。

したがって、私の理解では、これら 2 つの式の意味は同じですが、書き方が異なります。次の 2 つの出力は同じになるはずです。

console.log(B のインスタンス);
console.log(B.prototype.isPrototypeOf(A));


まとめ

実際、 isPrototypeOf関数を理解するには、プロトタイプ チェーンを理解することが重要です。

JavaScriptisPrototypeOf関数に関するこの記事はこれで終わりです。JavaScript の isPrototypeOf の詳細については、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Javascript プロトタイプ
  • JavaScript プロトタイプの詳細
  • jsネイティブ構文プロトタイプ、__proto__、コンストラクタの徹底的な理解
  • JavaScriptはプロトタイププロパティを使用して継承操作を実装する例
  • JS 配列の次元削減の実装 Array.prototype.concat.apply([], arr)
  • 先頭と末尾のスペースを削除する js String.prototype.trim 文字の拡張
  • JavaScript __proto__ とプロトタイプ

<<:  TinyEditorはシンプルで使いやすいHTML WYSIWYGエディタです

>>:  MySql マスタースレーブレプリケーションメカニズムの包括的な分析

推薦する

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

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

MySQL で null 値と空文字 ('') を区別する

日常の開発では、データベースの追加、削除、変更、クエリが一般的に行われるため、Mysql で NUL...

長いデータを HTML で表示するときに処理する方法

HTML で長いデータを表示する場合、マウスをその上に移動するとデータを切り捨てて完全なデータを表示...

10分でCSS3グリッドレイアウトを理解する

基本的な紹介前回の記事では、CSS3 のフレックスボックスを紹介しました。今日は、CSS3 のもう ...

ドロップダウンボックス選択コンポーネントを実装するためのネイティブ js

この記事の例では、ドロップダウンボックス選択コンポーネントを実装するためのjsの具体的なコードを参考...

MySQLデーモンの起動に失敗したエラーの解決方法

MySQLデーモンの起動に失敗したエラーの解決方法数日前、公開されたウェブサイトはこれらのアクティビ...

Vueフロントエンドの効率的な開発のためのレンダリング手順をリストします

v-for ディレクティブリストといえば、ループについても触れなければなりません。v-for 命令は...

URL 書き換えモジュール 2.1 URL 書き換えモジュールのルール記述

目次前提条件テストページの設定書き換えルールの作成命名規則モードの定義アクションの定義設定ファイル内...

MySQL 5.5.56 インストール不要版の設定方法

MySQL 5.5.56無料インストール版の設定方法をテキストコードで詳しく説明します。具体的な内容...

Oracle10パーティションとMySQLパーティションの違いの詳細な説明

一般的に使用される Oracle10g パーティションは、範囲 (範囲パーティション)、リスト (リ...

MySQL バイナリログデータ復旧: 誤ってデータベースを削除した場合の詳細な説明

MySQL Binログデータの回復: 誤ってデータベースを削除した場合前書き: テスト マシンで誤っ...

ページスピードの最適化の概要

インターネットは人々の生活にますます欠かせないものになってきていると思います。 Ajax や fle...

仮想マシン VMware に Kali Linux をインストールする最新の超詳細なグラフィック チュートリアル

目次1. システムイメージファイルをダウンロードする2. 新しい仮想マシンを作成する3. Kali ...

html オプション 無効 選択 選択 無効 オプションの例

コードをコピーコードは次のとおりです。 <選択> <オプション値="&q...

MySQLの数値型自動増分における落とし穴

テーブル構造を設計する場合、数値型は最も一般的な型の 1 つですが、数値型をうまく使用するのは想像す...