ECMAScript7仕様のinstanceof演算子の詳細な説明(例付き)
この記事では、ECMAScript7 仕様の instanceof 演算子について詳しく説明します (例を示します)。必要な方は参考にしてください。
この記事では、ECMAScript7仕様のinstanceof演算子を中心に説明します。
予備知識
有名なシンボル
「有名な」シンボルとは、Symbol オブジェクト上で定義された組み込みのシンボルを指します。 ECMAScript7 は、@@name の形式を使用してこれらの組み込みシンボルを参照します。たとえば、以下で説明する @@hasInstance は、実際には Symbol.hasInstance です。
InstanceofOperator(O, C)
O インスタンスオブ C は、内部的に InstanceofOperator(O, C) 抽象操作を呼び出します。 この抽象操作の手順は次のとおりです。 C の場合、データ型がオブジェクトではないため、型エラー例外がスローされます。
instOfHandler を GetMethod(C, @@hasInstance) とすると、おおよそのセマンティクスは @@hasInstance の値を取得します。オブジェクト C の属性;
instOfHandler の値が未定義でない場合:
ToBoolean(? Call(instOfHandler, C, « O »)) の結果を返します。 instOfHandler(O) を実行し、呼び出し結果を強制的にブール型に戻すことです。
C を呼び出すことができない場合は、型エラーの例外をスローします。
OrdinaryHasInstance(C, O) の結果を返します。
OrdinaryHasInstance(C, O)
OrdinaryHasInstance(C, O) 抽象操作の手順は次のとおりです。
C を呼び出すことができない場合は、false を返します。
C に内部スロット [[BoundTargetFunction]] がある場合:
BC を C の内部スロット [[BoundTargetFunction]] の値と等しくします。
Return InstanceofOperator(O, BC) 結果;
O の型がオブジェクトでない場合、false を返します。
P を Get(C, "prototype") とすると、おおよそのセマンティクスは値を取得します。 of C.prototype;
P のデータ型がオブジェクトでない場合は、型エラー例外をスローします。
次の手順を繰り返します。
O を O と等しくします。 [[GetPrototypeOf]]() 結果として、おおよそのセマンティクスは O のプロトタイプ オブジェクトを取得することになります。
O が null に等しい場合、
If の結果は false になります。 (P, O) が true の場合、true を返します。
SameValue 抽象操作は、JavaScript の ==、=== を参照し、Object.js() の Object.is() は、この抽象操作の結果を使用します。
上記の手順 2 から、C がバインド関数の場合、C によってバインドされたターゲット関数に対して InstanceofOperator(O, BC) 操作が再実行されることがわかります。
上記の手順 6 からわかるように、オブジェクト O のプロトタイプ オブジェクトが繰り返し取得され、その後、true が返されるまで、プロトタイプ オブジェクトと C のプロトタイプ属性が等しいかどうかが比較されます。等しい場合、または O が null になる場合、つまり、プロトタイプ チェーン全体が false を返します。
Function.prototype[@@hasInstance](V)
上記の InstanceofOperator(O, C) 抽象操作のステップ 2 と 3 から、C が上で定義されているか、または@ @hasInstance 属性を継承すると、手順 4 と 5 を行わずに属性の値が呼び出されます。手順 4 と 5 の目的は、@@hasInstance メソッドを実装していないブラウザと互換性を持たせることです。関数が @@hasInstance 属性を定義または継承していない場合は、デフォルトの instanceof セマンティクスが使用されます。これは、OrdinaryHasInstance(C, O) 抽象操作で記述されるステップです。
ECMAScript7仕様では、Functionのprototype属性に@@hasInstance属性が定義されています。 Function.prototype[@@hasInstance](V) の手順は次のとおりです:
F をこの値と等しくします;
OrdinaryHasInstance(F, V) の結果を返します。
つまり、デフォルトでは、instanceof のセマンティクスは同じであり、それらはすべて OrdinaryHasInstance(F, V) の結果を返すことがわかります。なぜデフォルトでそう言われるのでしょうか? Function.prototype[@@hasInstance] メソッドをオーバーライドして、instanceof の動作をカスタマイズできるためです。
例
function A () {} function B () {} var a = new A a.__proto__ === A.prototype // true a.__proto__.__proto__ === Object.prototype // true a.__proto__.__proto__.__proto__ === null // true a instanceof A // true a instanceof B // false
これは、OrdinaryHasInstance(C, O) のステップ 6 からわかります。
A のインスタンスの場合、最初のサイクルでは、P は A.prototype です。このとき、a のプロトタイプ オブジェクト a._proto__ は A.prototype、つまりステップ内の O は A.prototype なので、
#インスタンス オブ B の場合、P は B.prototype になります。 、最初のループでは、a のプロトタイプ オブジェクト a._proto__ は A.prototype であり、P と等しくありません。2 番目のループを実行します。この時点では、O は a.__proto__.__proto__ で、これは Object.prototype であり、等しくありません。 3 番目のループ、この時点では O は a.__proto__.__proto__.__proto__ であり、null です。つまり、プロトタイプ チェーンが走査されているため、false が返されます。 上記の例に従います:A.prototype.__proto__ = B.prototype a.__proto__ === A.prototype // true a.__proto__.__proto__ === B.prototype // true a.__proto__.__proto__.__proto__ === Object.prototype // true a.__proto__.__proto__.__proto__.__proto__ === null // true a instanceof B // true
function A () {} var a = new A a instanceof A // true A[Symbol.hasInstance] = function () { return false } a instanceof A // ?
在chrome浏览器测试了一下,发现还是输出true。然后看了一下ECMAScript6的文档,
ECMAScript6文档里面还没有规定可以通过@@hasInstance改变instanceof的行为,所以应该是目前chrome浏览器还没有实现ECMAScript7中的instanceof操作符的行为。
总结
本文主要讲解ECMAScript7规范中的instanceof操作符,希望大家能有所收获。
以上がECMAScript7仕様のinstanceof演算子の詳細な説明(例付き)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法 はじめに: 技術の継続的な発展により、音声認識技術は人工知能の分野の重要な部分になりました。 WebSocket と JavaScript をベースとしたオンライン音声認識システムは、低遅延、リアルタイム、クロスプラットフォームという特徴があり、広く使用されるソリューションとなっています。この記事では、WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法を紹介します。

WebSocketとJavaScript:リアルタイム監視システムを実現するためのキーテクノロジー はじめに: インターネット技術の急速な発展に伴い、リアルタイム監視システムは様々な分野で広く利用されています。リアルタイム監視を実現するための重要なテクノロジーの 1 つは、WebSocket と JavaScript の組み合わせです。この記事では、リアルタイム監視システムにおける WebSocket と JavaScript のアプリケーションを紹介し、コード例を示し、その実装原理を詳しく説明します。 1.WebSocketテクノロジー

JavaScript と WebSocket を使用してリアルタイム オンライン注文システムを実装する方法の紹介: インターネットの普及とテクノロジーの進歩に伴い、ますます多くのレストランがオンライン注文サービスを提供し始めています。リアルタイムのオンライン注文システムを実装するには、JavaScript と WebSocket テクノロジを使用できます。 WebSocket は、TCP プロトコルをベースとした全二重通信プロトコルで、クライアントとサーバー間のリアルタイム双方向通信を実現します。リアルタイムオンラインオーダーシステムにおいて、ユーザーが料理を選択して注文するとき

WebSocket と JavaScript を使用してオンライン予約システムを実装する方法 今日のデジタル時代では、ますます多くの企業やサービスがオンライン予約機能を提供する必要があります。効率的かつリアルタイムのオンライン予約システムを実装することが重要です。この記事では、WebSocket と JavaScript を使用してオンライン予約システムを実装する方法と、具体的なコード例を紹介します。 1. WebSocket とは何ですか? WebSocket は、単一の TCP 接続における全二重方式です。

JavaScript と WebSocket: 効率的なリアルタイム天気予報システムの構築 はじめに: 今日、天気予報の精度は日常生活と意思決定にとって非常に重要です。テクノロジーの発展に伴い、リアルタイムで気象データを取得することで、より正確で信頼性の高い天気予報を提供できるようになりました。この記事では、JavaScript と WebSocket テクノロジを使用して効率的なリアルタイム天気予報システムを構築する方法を学びます。この記事では、具体的なコード例を通じて実装プロセスを説明します。私たちは

使用法: JavaScript では、insertBefore() メソッドを使用して、DOM ツリーに新しいノードを挿入します。このメソッドには、挿入される新しいノードと参照ノード (つまり、新しいノードが挿入されるノード) の 2 つのパラメータが必要です。

JavaScript チュートリアル: HTTP ステータス コードを取得する方法、特定のコード例が必要です 序文: Web 開発では、サーバーとのデータ対話が頻繁に発生します。サーバーと通信するとき、多くの場合、返された HTTP ステータス コードを取得して操作が成功したかどうかを判断し、さまざまなステータス コードに基づいて対応する処理を実行する必要があります。この記事では、JavaScript を使用して HTTP ステータス コードを取得する方法を説明し、いくつかの実用的なコード例を示します。 XMLHttpRequestの使用

JavaScript は Web 開発で広く使用されているプログラミング言語であり、WebSocket はリアルタイム通信に使用されるネットワーク プロトコルです。 2 つの強力な機能を組み合わせることで、効率的なリアルタイム画像処理システムを構築できます。この記事では、JavaScript と WebSocket を使用してこのシステムを実装する方法と、具体的なコード例を紹介します。まず、リアルタイム画像処理システムの要件と目標を明確にする必要があります。リアルタイムの画像データを収集できるカメラ デバイスがあるとします。
