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

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

推薦する

Dockerのデフォルトネットワークセグメントを変更する実装方法の分析

背景同社のサーバーはすべて Alibaba Cloud ECS ホストを購入しています。デフォルトの...

シンプルな計算機を実装する JavaScript コード

この記事では、参考までに、簡単な計算機を実装するためのJavaScriptの具体的なコードを紹介しま...

Linux centos7 に phpMyAdmin をインストールするチュートリアル

yum install httpd php mariadb-server –yランプの動作環境を設定...

HTML+CSS+jQuery はスクリーンショットで検索ホットリストタブ効果を模倣します

コードをコピーコードは次のとおりです。 <!DOCTYPE html PUBLIC "...

MySQL クエリ キャッシュとバッファ プール

1. キャッシュ - クエリキャッシュ次の図は、MySQL 公式サイトから提供されています: MyS...

jQueryはすべての選択と逆選択操作ケースを実装します

この記事では、全選択と逆選択操作を実装するためのjQueryの具体的なコードを参考までに共有します。...

MySQLのスローログの開き方と保存形式の詳細な分析

開発プロジェクトでは、MySQL のスロークエリログを通じて効率の問題のある SQL を監視できます...

docker-maven-pluginプラグインは対応するjarパッケージを取得できません

docker-maven-plugin プラグインを使用する場合、Maven は対応する jar パ...

Workbench を介して MySQL データベースにリモートでアクセスする方法の詳細な説明

序文Workbench が 1 台のコンピューターにインストールされており、別の Ubuntu サー...

CentOS 8 カスタム ディレクトリ インストール nginx (チュートリアルの詳細)

1. ツールとライブラリをインストールする# PCRE は、Perl 互換の正規表現ライブラリを含...

Typescript での infer キーワードの使用に関する詳細な理解

目次推測する事例:理解を深める参照する後で忘れないように、キーワード infer をメモしておきます...

CSS 透明ボーダー背景クリップマジック

この記事では、CSSの透明な境界線の背景クリップの素晴らしい使い方を主に紹介し、みんなと共有し、自分...

CSS初心者向けチュートリアル: 背景画像を画面全体に表示する

インターフェース全体に背景画像を表示したい場合は、当然 body に背景を追加することを考えます。コ...

Docker ベースの Selenium 分散環境の構築

1.画像をダウンロードするdocker pull selenium/hub docker pull ...

素晴らしい CSS ナビゲーション バーの下線効果

中国初のカッター github.com/chokcocoまず、ここに画像があります。純粋な CSS ...