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 における in と exists の違いの詳細な説明

1. 事前に準備する便宜上、ここで 2 つのテーブルを作成し、そこにいくつかのデータを追加します。果...

MySQL 5.7.24 のインストールと設定のグラフィックチュートリアル

この記事では、MySQL 5.7.24のインストールと設定のチュートリアルを参考までに紹介します。具...

CSSをインポートする方法に関する詳細な洞察の要約

CSS の開発履歴についてはここでは紹介しません。ブログを書いている理由の 1 つは、フロントエンド...

Vue の状態管理: Vuex の代わりに Pinia を使用する

目次1. ピニアとは何ですか? 2. Piniaは使いやすい3. ユーザーエクスペリエンス1. ピニ...

JavaScript strictモードの概要 strictを使用する

目次1. 概要1.1 厳密モードとは何ですか? 1.2 厳密モードの目的2. 厳密モードを有効にする...

一定期間の日ごと、時間ごとの統計データを取得するMySQLの詳しい説明

毎日の統計情報を取得するプロジェクトを実行する際、プロジェクト ログを分析する必要があります。要件の...

シンプルな画像ドラッグ効果を実現する js

この記事では、簡単な画像ドラッグ効果を実現するためのjsの具体的なコードを参考までに紹介します。具体...

Vueカウンターの実装

目次1. カウンターの実装2. 成果を達成する1. カウンターの実装ページにカウンターを実装するだけ...

HTML5 と HTML4 の 10 の主な違い

HTML5 は HTML 標準の次のバージョンです。ますます多くのプログラマーが、Web サイトの構...

Vue フィルター、ライフサイクル関数、vue-resource の簡単な紹介

1. フィルター例: <!DOCTYPE html> <html lang=&qu...

Unix/Linux システムにおける nobody ユーザーと nologin の詳細な紹介

Unix/Linux システムの nobody ユーザーとは何ですか? 1. Windows システ...

モバイルデバイス用のメタタグ設定の完全なリスト

序文以前フロントエンドを勉強していたとき、メタタグに対する私の理解はこの一文だけでした。 <メ...

シンプルなビデオ連射機能を実装する JavaScript CSS3

この記事では、最も単純なビデオ連射機能をシミュレートするデモを作成します。アイデア:再生する動画と同...

速度、読み込み、Web アプリケーションなどにおける div と table の違い。

1: 速度と読み込み方法の違いdivとtableの違いは速度ではなく、読み込み方法です。速度はネット...