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 マスタースレーブレプリケーションメカニズムの包括的な分析

推薦する

MySQL での and or クエリの優先度分析

これは見落とされがちな問題かもしれません。まず、次の点を明確にする必要があります。 MySQL では...

JS配列重複排除の詳細

目次1 テストケース2 JS配列重複排除4種類2.1 要素の比較2.1.1 二重層 for ループ比...

Ubuntu環境でPHPとNginxをコンパイルしてインストールする方法

この記事では、Ubuntu 環境で PHP と Nginx をコンパイルしてインストールする方法につ...

dockerを使用してTomcatをデプロイし、Skywalkingに接続する

目次1. 概要2. dockerを使用してTomcatをデプロイし、Skywalkingに接続する要...

CSS フィルターを使用してマウスオーバー効果を記述する例

CSSフィルターを使用してマウスオーバー効果を記述する <div class="fi...

HTMLでマスクレイヤーを実装する方法 HTMLでマスクレイヤーを使用する方法

Web ページでマスク レイヤーを使用すると、繰り返しの操作を防ぎ、読み込みを促進できます。また、ポ...

Linux の文字端末でマウスを使って赤い四角形を移動する方法

すべてがファイルです! UNIX はすでにそれを言っています。エリック・レイモンドはこう言いました。...

MySQL 文字セットの表示と変更のチュートリアル

1. 文字セットを確認する1. MYSQLデータベースサーバーとデータベースの文字セットを確認する方...

Centos7.3 で mysql5.7.18 をインストールして初期パスワードを変更する方法

この記事では、Centos7.3でのmysql5.7.18のインストールと初期パスワードの変更につい...

Vueはdivホイールのズームインとズームアウトを実装します

Vue プロジェクトで div ホイールのズームインとズームアウト、ドラッグ効果、キャンバス効果に似...

MySQL データベースのデータ テーブルの最適化、外部キーの分析、3 つのパラダイムの使用

この記事では、例を使用して、MySQL データベースのデータ テーブルの最適化、外部キーの使用、およ...

IEではボタンが両側に伸びる

ボタン (input, button) を記述すると、IE では次のようになります。単語数が増えると...

Nginx を使用してクロスドメイン Vue 開発環境を処理する方法

1. 需要正しい Cookie 配信と SSO テストを確実に実行できるように、ローカル テスト ド...

dockerコンテナにviコマンドをインストールする簡単な操作

docker コンテナを使用する場合、vim がインストールされていないことがあり、vim コマンド...

MySQL 5.7.18 バージョンの無料インストール構成チュートリアル

MySQLはインストール版と無料インストール版に分かれていますインストール版の拡張子はmsi、無料イ...