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

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

推薦する

mysql 解凍パッケージの基本インストールチュートリアル

新しいコンピューターに変更したので、すべての環境を新しいコンピューター上で設定する必要があります。ふ...

WeChat アプレット計算機の例

WeChatアプレット計算機の例、参考までに、具体的な内容は次のとおりです。インデックス.wxml ...

Ubuntu システムでタイムゾーンと時刻を変更する方法

Linux コンピュータには 2 つの時間があります。1 つはハードウェア時間 (BIOS に記録さ...

ウェブページのエクスペリエンス: ウェブページのカラーマッチング

<br />ウェブページの色はウェブサイトのイメージを確立する鍵の一つですが、ネットユー...

Docker を使用した Laravel アプリケーションのデプロイ例

この記事で使用されているPHPベースイメージはphp:7.3-apacheです。この記事の Lara...

Vueは画像のドラッグアンドドロップ機能を実装します

この記事の例では、画像のドラッグアンドドロップ機能を実現するためのVueの具体的なコードを参考までに...

docker を使用して Windows 10 Home バージョンで Laravel 開発環境を構築する方法の詳細なチュートリアル

オペレーティング·システム: Win10 ホームエディションDockerをインストールします:公式サ...

MySQL の遅いクエリの例

導入スロークエリログを有効にすると、MySQL は指定された時間を超えるクエリステートメントを記録で...

MYSQL フルバックアップ、マスタースレーブレプリケーション、カスケードレプリケーション、および半同期の概要

MySQL フルバックアップ1. バイナリログを有効にし、データベースから分離して別々に保存する v...

CentOS 7でsambaを使用してフォルダーを共有するための完全な手順

序文Samba は、サーバー プログラムとクライアント プログラムで構成され、Linux システム上...

DockerにRedisをインストールし、パスワードを設定して接続する方法

Redis は分散キャッシュ サービスです。キャッシュは、大規模システムの開発やパフォーマンスの最適...

仮想マシンの複製に関するVirtual Boxチュートリアル図

VMに慣れた後、BOXに切り替えるのは少し異なります。たとえば、コピーネットワークカードを2枚使って...

自己終了XHTMLタグを書くときに注意すべきこと

XHTMLの img タグは、次のように記述する必要があります: <img alt="...

Vueは3階層メニューを再帰的に実装する

この記事の例では、3階層メニューを再帰的に実装するVueの具体的なコードを参考までに共有しています。...

Nginx gzip設定について

nginx がリソース圧縮を実現する原理は、ngx_http_gzip_module モジュールを介...