JavaScript の instanceof メソッドの手動実装

JavaScript の instanceof メソッドの手動実装

1. instanceofの使用法

instanceof演算子は、コンストラクター関数のprototypeプロパティがインスタンス オブジェクトプロトタイプ チェーンに出現するかどうかを検出するために使用されます。

関数 Person() {}
関数 Person2() {}

Person を新規作成します。

console.log(usr instanceof Person); // true
console.log(usr instanceof Object); // true

console.log(usr instanceof Person2); // false

上記のコードに示すように、2 つのコンストラクターPersonPerson2が定義され、 new操作を使用してPersonインスタンス オブジェクトusrが作成されます。

instanceof演算子を使用して、コンストラクターprototypeプロパティがusrインスタンスのプロトタイプ チェーン上にあるかどうかを確認します。

もちろん、結果は、 PersonObjectprototypeプロパティがusrのプロトタイプ チェーン上にあることを示しています。 usr Person2のインスタンスではないため、 Person2prototypeプロパティはusrのプロトタイプ チェーン上にありません。

2. instanceofの実装

instanceofの機能と原理を理解した後、 instanceofと同じ機能を持つ関数を実装できます。

関数 myInstanceof(obj, コンストラクター) {
    // obj の暗黙的なプロトタイプ let implicitPrototype = obj?.__proto__;
    // コンストラクターのプロトタイプ const displayPrototype =constructor.prototype;
    // プロトタイプチェーンを走査します while (implicitPrototype) {
        // 見つかったので true を返す
        if (implicitPrototype === displayPrototype) が true を返します。
        暗黙のPrototype = 暗黙のPrototype.__proto__;
    }
    // トラバーサルは終了しましたが、まだ見つかっていない場合は false を返します
    false を返します。
}

myInstanceof関数は、インスタンス オブジェクトobjとコンストラクターconstructor 2 つのパラメーターを受け取ります。

まず、インスタンス オブジェクトの暗黙的なプロトタイプ (コンストラクター関数constructor.prototypeのプロトタイプ オブジェクト、 obj.__proto__を取得します。

次に、前のレベルの暗黙的なプロトタイプを取得し続けることができます。

暗黙のPrototype = 暗黙のPrototype.__proto__;

プロトタイプ チェーンをトラバースするには、 displayPrototypeプロトタイプ チェーン上にあるかどうかを確認し、見つかった場合はtrueを返します。

implicitPrototypenullの場合、検索は終了し、見つからない場合はfalseが返されます。

プロトタイプ チェーンは、実際にはリンク リストに似たデータ構造です。

instanceof 、リンク リスト内にターゲット ノードが存在するかどうかを確認します。ヘッダーノードから始めて、連続的に後方にトラバースします。ターゲットノードが見つかった場合はtrueを返します。トラバーサルが終了し、オブジェクトが見つからない場合は、 falseが返されます。

3. 検証

instanceofの実装を確認するための簡単な例を書いてください。

関数 Person() {}
関数 Person2() {}

Person を新規作成します。

関数 myInstanceof(obj, コンストラクター) {
    暗黙のPrototypeをobj?.__proto__とします。
    const displayPrototype = コンストラクター.prototype;
    (暗黙のプロトタイプ) の間 {
        if (implicitPrototype === displayPrototype) が true を返します。
        暗黙のPrototype = 暗黙のPrototype.__proto__;
    }
    false を返します。
}

myInstanceof(usr, Person); // 真
myInstanceof(usr, Object); // 真

myInstanceof(usr, Person2); // 偽
myInstanceof(usr, Function); // 偽

myInstanceof(usr.__proto__, Person); // 偽
usr.__proto__ instanceof Person; // false

ご覧のとおり、 myInstanceof正しい結果を生成します。

興味深いことに、 usr.__proto__ instanceof Person false返します。これは、 obj instanceof constructorによって検出されたプロトタイプ チェーンにobjノード自体が含まれていないことを示しています。

一般的な手書きの JavaScript コード:

「GitHub — code-js」

JavaScript で手動で instanceof を実装する方法についての記事はこれで終わりです。JavaScript の instanceof に関するより関連性の高いコンテンツについては、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Javascriptの理解_07_instanceofの実装原理を理解する
  • JavaScript における typeof と instanceof の使用法の詳細な説明
  • JavaScript での instanceof 演算子の使用例
  • JavaScript で instanceof 演算子を使用する例
  • JavaScript の型検出: typeof と instanceof の欠陥と最適化
  • JavaScript における instanceof 演算子の使用法の概要
  • JS における typeof と instanceof の違いのまとめ

<<:  Dockerコンテナ内のホストのホスト名が取得できない問題の解決方法

>>:  行の高さと垂直方向の配置についての深い理解

推薦する

Vue-router は現在の場所 (/path) へのナビゲーションを許可しません。エラーの原因と修正

目次エラーメッセージ原因エラーのデモンストレーション回避策方法1方法2方法3エラーメッセージ現在の場...

Nginx 正規表現の詳細な説明

Nginx (エンジン x) は、高性能な HTTP およびリバース プロキシ サーバーであり、IM...

vue-cli 設定では Vuex の完全なプロセスレコードを使用します

目次序文インストールと使用方法モジュラー管理Vuex の状態永続性要約する序文Vue 開発では、ユー...

Linux で Sudo を使用して権限を委譲する

sudo 権限委譲の概要su スイッチ ID: su –l ユーザー名 –c 'コマンド&#...

CSS3 で @media を使用して Web ページの適応を実現するためのサンプル コード

現在、コンピュータモニターの画面解像度はますます高くなる傾向にありますが、携帯電話などのモバイルデバ...

MySQLの暗黙的な変換問題の解決

1. 問題の説明 root@mysqldb 22:12: [xucl]> テーブル t1\G ...

Reactエラー境界コンポーネント処理

React 16の内容です。最新技術ではありませんが、ドキュメントで調べるまであまり話題に上がらなか...

ポータルサイト再設計のユーザーエクスペリエンス

<br />2006年10月12日のNetEaseの新ホームページの公開から、2008年...

MySQL テーブルとデータベース シャーディングのアプリケーション シナリオと設計方法

多くの友人がフォーラムやメッセージエリアで、どのような状況で MySQL をシャーディングする必要が...

Redmine の Docker インストール手順

イメージをダウンロードします(オプションの手順です。省略した場合は、手順 3 と 4 で自動的にイン...

Reactドラッグフックを実装するための100行以上のコード

序文ソースコードは合計で 100 行強しかありません。これを読めば、react-dnd などの成熟し...

Vite2.x に基づく Vue 3.x プロジェクトの実装

Vue 3.x プロジェクトの作成 npm init @vitejs/app my-vue-app ...

CSSの幅と高さのデフォルト値の詳細な説明:autoと%

結論は幅の%: 包含ブロック(親要素)の幅に基づいて、親の制限を超える幅のパーセンテージを定義します...

インタビュアーはCSSで固定アスペクト比を実現する方法を尋ねました

この質問に関連するニーズはまだないかもしれませんし、面接でこの質問をされたことがないかもしれませんが...

1 行または複数行のテキストがオーバーフローしたときに省略記号を表示する CSS を実装する方法

1. 単一行オーバーフロー1. 1 行がオーバーフローした場合、超過部分は表示されます...または、...