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

推薦する

HTML の相対パス (Relative Path) と絶対パス (Absolute Path) の詳細な理解

私は 1 年以上 Java Web 開発に携わっており、HTML または JSP ページの作成は避け...

Dockerコンテナのインポ​​ートとエクスポートに関するチュートリアル

背景Docker の人気は、コンテナの共有と移植が容易であることと密接に関係しています。ユーザーは、...

JavaScript で DOM 要素を監視する MutationObServer の詳細

1. 基本的な使い方これは MutationObserver コンストラクターを通じてインスタンス化...

MySQL イベント スケジューラに関するよくある話 (必読)

概要MySQL には独自のイベント スケジューラもあり、これは Linux の crontab ジョ...

Bootstrap 3.0 学習ノート グリッドシステム事例

序文前回の記事では、主にグリッドシステムの基本原理を学び、簡単なケースを通してその原理を実践しました...

mysql の追加、削除、変更、クエリの基本ステートメント

文法以下は、MySQL テーブルにデータを挿入するための INSERT INTO コマンドの一般的な...

Nginx http ヘルスチェック構成プロセス分析

パッシブチェックパッシブ ヘルス チェックでは、NGINX と NGINX Plus はイベントの発...

CSS3 FlexBox の伸縮自在なレイアウトを 10 分で理解する

基本的な紹介特徴Flexbox は、よりシンプルで効率的なレイアウト方法を提供する CSS 表示タイ...

HTML テーブル マークアップ チュートリアル (16): タイトルの水平方向の配置属性 ALIGN

デフォルトでは、表のタイトルは水平方向に中央揃えされます。ALIGN 属性を使用して、タイトル テキ...

SQLインジェクションの詳しい解説 - セキュリティ編(第2部)

この記事に誤りがあったり、ご提案がありましたら、お気軽にご連絡ください。よろしくお願いいたします。は...

XHTML言語のデフォルトCSSスタイル

html、アドレス、引用ブロック、本文、dd、div、 dl、dt、フィールドセット、フォーム、フレ...

jQuery をベースにリスト ループ スクロールを実装するためのヒント (超簡単)

良いアイデアを見つけたので記録しました。私は以前、スクロール効果を実現するためにjQueryを使用し...

MySQLデータベースのトランザクションとインデックスの詳細な説明

目次1. 事務:取引の 4 つの主な特徴:同時トランザクションはどのような問題を引き起こしますか? ...

Webデザインの経験:ナビゲーションシステムをシンプルにする

<br />友人と話し合っていたとき、フレームワークのレイヤー設計の中で最も核となるのは...

Linux で開いているポートへのリモート アクセスを許可する方法

1. ファイアウォール設定ファイルを変更する # vi /etc/sysconfig/iptable...