オブジェクトがコンストラクターのインスタンスであるかどうかを確認するために、instanceof 演算子が使用されることがわかっています。 true を返すさまざまなシナリオを以下に示します。
1. 新しいコンストラクターを通じてオブジェクト obj が作成され、obj インスタンスオブコンストラクターが true になります
function Person(n, a) {
this.name = n;
this.age = a; var p = new Person('John Backus', 82);
console.log(p instanceof Person) // true
2.親クラスも true を返します
function A( ){}
function B(){}
B.prototype = new A() // B は A から継承
var b = new B( );
console.log (b instanceof A); // true
3. Object はルート クラスであるため、他のすべてのカスタム クラスはそれを継承します。任意のコンストラクターが true を返す
関数A() {}
var a = new A();
console.log(a instanceof Object) // true
var str = new String console.log(strinstanceofObject); //true
var num = new Number(1);
console.log(numinstanceofObject); //true 🎜>コンストラクター自体も
コードをコピー
4. すべてのコンストラクター instanceof 関数は true を返します
コードをコピー
コードは次のとおりです
上記の 4 つの点を 1 つの文にまとめます。
インスタンスが特定のクラスまたはそのサブクラスによって作成された場合の場合、instanceof は true を返します。
または、オブジェクト obj の内部プロトタイプ チェーン上に特定のコンストラクターのプロトタイプが存在する場合、true が返されます。つまり、instanceof の結果はコンストラクター自体とは直接の関係がありません。これは多くの言語で一般的です。
クラス Person は Java で定義されており、インスタンス p は Person と Object の両方に対して true を返します
コードをコピー
コードは次のとおりです
this .age = a;
}
public static void main(String[] args) {
person p = new person("John Backus", 82); .println(p instanceof Person); // true
System.out.println(p instanceof Object) // true
}
}
継承がある場合Java で関係がある場合、親クラスの子クラスのインスタンスも true を返します
コードをコピー
コードは次のとおりです。
// 親クラス
class person {
public String name;
public int age;
person (String n, int a) {
name = name; 🎜> age = a;
}
}
// サブクラス
public クラス Man は person{
public String 大学 ) {
super(n, a); > 大学 = s;
}
public static void main(String[] args) {
Man mm = new Man("John Resig" , 29, "PKU"); .println(mm instanceof Man); // true
System.out.println(mm instanceof Person) // これも true
}
}
JS での次のパフォーマンスは驚くべきことではありません
コードをコピー
function B(){}
A.prototype = B.prototype = {a: 1};
// 異なるコンストラクターの 2 つのインスタンスを作成しますそれぞれ
var a = new A();
var b = new B(); // true
console.log(b instanceof A); // true
a、b がそれぞれ A と B で作成されていることがわかりますが、ainstanceofB と binstanceofA は両方とも true です。つまり、 a はコンストラクター B で作成されませんでしたが、それでも true を返します。 B.prototype は a の内部プロトタイプ チェーンに存在するためです。
JS の動的言語特性により、プロトタイプは実行時に変更される可能性があるため、以下が false を返すことは驚くべきことではありません。 A.prototype は a の内部プロトタイプ チェーンに存在しなくなったため、チェーンは中断されます。
コードをコピー
コードは次のとおりです:function A(){} var a = new A(); A.prototype = {}; // プロトタイプを動的に変更します。
console.log(a instanceof A) を作成した後に行う必要があることに注意してください。
この記述は、上で要約した最初の点も破っていることに注意してください。オブジェクト obj は new Constructor を通じて作成され、obj instanceof Constructor は true
実際、ECMAScript 標準 (5.1 に準拠) では、instanceof の内部実装はコンストラクターの内部メソッド [[HasInstance]] を呼び出します。これは次のように説明されます
F が関数オブジェクトの場合、F(V) が実行されると、次のステップが発生します。
1.instanceof の左側のオペランド V がオブジェクト型でない場合は、直接 false を返します
コードをコピーします
console.log(c オブジェクトのインスタンス); // 偽
console.log(d オブジェクトのインスタンス); // 偽
2/3 、コンストラクター F のプロトタイプ属性を取得します。オブジェクト型でない場合は、TypeError 例外をスローする必要があります。
コードをコピー
コードは次のとおりです。function A(){} A.prototype = 1 // A のプロトタイプを非オブジェクト型に設定します。 🎜>var a = new A(); console.log (a instanceof A);
各ブラウザによってスローされる例外プロンプトは異なります。
Firefox18:
Chrome24:
Safari6:
オペラ 12:
IE10:
4. 次のロジックを継続的に実行します。V を内部プロトタイプの V に設定します。V と O が両方とも同じオブジェクトを指している場合は、true を返します。