では、instanceof のこの動作はどのように実装されているのでしょうか? 次に、instanceof の背後にある謎を明らかにしましょう。
instanceof の原則
いつものように、最初にコードを見てみましょう:
function Cat(){}
Cat.prototype = {}
function Dog(){}
Dog。プロトタイプ ={}
var Dog1 = new Dog();
alert(dog1 instanceof Dog);//true
alert(dog1 instanceof Object);//true
Dog.prototype = Cat.プロトタイプ;
alert (dog1 instanceof Dog);//false
alert(dog1 instanceof Cat);//false
alert(dog1 instanceof Object);//true; ();
alert(dog2instanceofDog);//true
alert(dog2instanceofCat);//true
alert(dog2instanceofObject);//true
Dog.prototype = null ;
var Dog3 = new Dog();
alert(dog3 インスタンス of Cat);//false
alert(dog3 インスタンスオブ オブジェクト);//true
alert(dog3 インスタンスオブ ドッグ);//エラー
メモリ グラフを描いて分析しましょう:
メモリ グラフはより複雑です。説明してください:
プログラム自体は動的な概念です。プログラムが実行されると、Dog .prototype は変化し続けます。ただし、便宜上、プロトタイプ参照におけるこれら 3 つの変更を表現するために、1 つの絵だけを描きました。ヒープ内で、右側は関数オブジェクトのメモリ表現、中央は関数オブジェクトのプロトタイプ属性へのポインタ、左側は関数オブジェクトによって作成されたオブジェクト インスタンスです。 Dog.prototypeの3つの参照変更に対応して、prototype属性を指す関数オブジェクトのポインタがそれぞれdog1、dog2、dog3と記述される。また、スタック内の Dog1、dog2、dog3 と対応する関係もあります。 (注: 関数オブジェクトについては、今後のブログ投稿で説明します)
注意すべき点の 1 つは、dog3 の関数オブジェクトのプロトタイプ属性が null である場合、関数オブジェクト インスタンス Dog3 の内部 [[prototype]] 属性は、オブジェクトのプロトタイプを指定します。これについては、「JavaScript を理解する_06_オブジェクトの作成プロセスを理解する」で説明しています。
結論
コードの実行結果とメモリ構造に基づいて、結論が導き出されます:
instanceof オブジェクト A が別のオブジェクト B のインスタンスであるかどうかを検出する原理は次のとおりです: オブジェクトをチェックするオブジェクト B のプロトタイプが指すオブジェクト A の [[prototype]] チェーン上にあるかどうか。存在する場合は true を返し、そうでない場合は false を返します。ただし、オブジェクト B のプロトタイプが null の場合は、エラーが報告されます (null ポインター例外と同様)。
Time Ruge からのおすすめの記事です。これは、instanceof の原理についてのものです。角度は異なりますが、目的は同じです。