ホームページ  >  記事  >  ウェブフロントエンド  >  JavaScript での instanceof の解析は、さまざまなコンストラクターに対して true を返す場合があります_JavaScript のヒント

JavaScript での instanceof の解析は、さまざまなコンストラクターに対して true を返す場合があります_JavaScript のヒント

WBOY
WBOYオリジナル
2016-05-16 17:10:53967ブラウズ

オブジェクトがコンストラクターのインスタンスであるかどうかを確認するために、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 🎜>コンストラクター自体も



コードをコピー

コードは次のとおりです。function A( ) {} console.log(AinstanceofObject); //trueconsole.log(StringinstanceofObject) //trueconsole.log(NumberinstanceofObject); >

4. すべてのコンストラクター instanceof 関数は true を返します




コードをコピー
コードは次のとおりです
上記の 4 つの点を 1 つの文にまとめます。

インスタンスが特定のクラスまたはそのサブクラスによって作成された場合の場合、instanceof は true を返します。

または、オブジェクト obj の内部プロトタイプ チェーン上に特定のコンストラクターのプロトタイプが存在する場合、true が返されます。つまり、instanceof の結果はコンストラクター自体とは直接の関係がありません。これは多くの言語で一般的です。
クラス Person は Java で定義されており、インスタンス p は Person と Object の両方に対して true を返します
コードをコピー


コードは次のとおりです

class person { public String name; public int age; person (String n, int a) { this.name = name;
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 での次のパフォーマンスは驚くべきことではありません



コードをコピー
コードは次のようになります: // 2 つを定義しますコンストラクター function A(){}
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 を返します

コードをコピーします

コードは次のとおりです次のように: var a, b = 1, c = true, d = 'hello'; console.log(ainstanceof Object) // ここでは値は未定義です console.log( b オブジェクトのインスタンス); // 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 を返します。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。