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コンテナ内のホストのホスト名が取得できない問題の解決方法

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

推薦する

Electronで不規則な形状の透明部分をクリックする実装

目次不規則なフォームの実装透明な部分をクリックする不規則なフォームの実装ここでは円形フォームを実装し...

解決策 - BASH: /HOME/JAVA/JDK1.8.0_221/BIN/JAVA: 権限が不十分です

1) jdkファイルが保存されているフォルダパスを入力します私はここにいますusr/local/jd...

mysql5.7.21.zip インストールチュートリアル

mysql5.7.21 zipの詳細なインストール手順は次のとおりです。 1. 解凍して指定されたデ...

WeChat アプレットのカスタム タブバー コンポーネント

この記事では、WeChatアプレットのカスタムタブバーコンポーネントの具体的なコードを参考までに紹介...

Reactを使用して画像認識アプリを実装する方法

まずは効果の写真をお見せしましょう。 個人的には効果は問題ないと思います。アプリが写真を学習する時間...

JavaScript ファイルの読み込みとブロックの問題: パフォーマンス最適化のケーススタディ

まず質問させてください。HTML ページを作成するときに、外部から JS ファイルをインポートする場...

画像をハイパーリンクとして使用したときに表示される青いボックスを削除する方法

最近、Dreamweaver を使用して製品プレゼンテーションを作成し、画像にハイパーリンクを追加し...

CSS3は三角形の連続拡大効果を実現します

1. CSS3の三角形は特殊効果でズームし続けます11.1 画像プレビュー 11.2 index.h...

div要素に丸い境界線を追加する方法

以下のように表示されます。 CSSコードコンテンツをクリップボードにコピー分割{境界線: 2px 固...

親要素に対する CSS 子要素の固定配置ソリューションの詳細な説明

基本概念絶対配置: 絶対配置に設定された要素ボックスはドキュメント フローから完全に削除され、その包...

mysql 5.7.18 winx64 無料インストール設定方法

1. ダウンロード2. 減圧3. パス環境変数を追加し、mysqlが配置されているbinディレクトリ...

HTML スペースコードの簡単な分析

HTML についてどれくらい知っていますか? 現在、基本的な HTML コードを学習している場合は、...

非常に便利なオープンソース Docker ツール 5 つを強くお勧めします

導入Docker コミュニティは、さまざまなユースケースを処理するのに役立つ多くのオープンソース ツ...

JavaScript が Xiaomi のカルーセル効果を模倣

この記事は、透明度を変えてカルーセルにするXiaomiカルーセルを真似て書いたものです。初心者なので...

VMware のインストールと使用時の問題と解決策

仮想マシンは使用中であるか、接続できません次のようなエラーが報告された場合解決まずこのページにアクセ...