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

推薦する

Linux での wget コマンドの基本的な使い方

目次序文1. wgetを使用して単一のファイルをダウンロードする2. wget -Oを使用してダウン...

CSS3を使用してボタンホバーフラッシュダイナミック特殊効果コードを実装する

CSS3 の列シリーズ属性を使用してウォーターフォールレイアウトを作成する方法を紹介しました。興味の...

Vue+SSMは画像アップロードのプレビュー効果を実現します

現在の要件は、ファイルのアップロード ボタンがあることです。ボタンをクリックすると、アップロードする...

MySQL インデックスの長所と短所、およびインデックス作成のガイドライン

1. インデックスを作成する理由(メリット)インデックスを作成するとシステムのパフォーマンスが大幅に...

CSS の無効な行の高さ設定の問題の解決策

CSS の無効な行の高さ設定についてまず、次のコード文字列を記述します。 <!DOCTYPE ...

DockerでVueプロジェクトをデプロイする方法を教えます

1.前面に書きます:軽量仮想化テクノロジーとして、Docker には継続的インテグレーション、バージ...

Vueプロジェクトはログインと登録の効果を実現します

この記事の例では、ログインと登録の効果を実現するためのvueプロジェクトの具体的なコードを共有してい...

ウェブページを最適化してメモリとCPUの使用率を削減

一部の Web ページは大きく見えなくても開くのに非常に時間がかかる場合があります。一方、他の We...

Windows 64 ビットに MySQL を再インストールするチュートリアル (Zip バージョン、解凍バージョンの MySQL インストール)

MySQLをアンインストールする1. コントロールパネルで、MySQLのすべてのコンポーネントをア...

JavaScript実行メカニズムの詳細な紹介

目次1. プロセスとスレッドの概念2. ブラウザの原則3. 同期と非同期4. 実行スタックとタスクキ...

Vueがビデオアップロード機能を実装

この記事では、参考までに、ビデオアップロード機能を実現するためのVueの具体的なコードを紹介します。...

JPG、GIF、PNGなどのさまざまな画像形式の詳細な説明

ウェブページ上の画像が一般的に jpg、gif、png 形式であることは誰もが知っています。それらの...

Vue の計算プロパティの紹介

目次1. 計算プロパティとは何ですか? 2. 計算プロパティの構文3. 例1. 計算プロパティとは何...

MySQL 5.7.21 解凍版のインストールと設定方法のグラフィックチュートリアル

私は頻繁にシステムをインストールするので、インストールのたびにいくつかのソフトウェアを再インストール...

Vite+ElectronでVUE3デスクトップアプリケーションを素早く構築

目次1. はじめに2. Viteプロジェクトを作成する1. viteをインストールする2. プロジェ...