instanceofには、これまでのどのコメントでもカバーされていないように見える重要な側面があります。それは継承です。instanceofを使用して評価される変数は、プロトタイプの継承により、複数の「タイプ」に対してtrueを返す可能性があります。
たとえば、タイプとサブタイプを定義してみましょう:
function Foo(){ //a Foo constructor
//assign some props
return this;
}
function SubFoo(){ //a SubFoo constructor
Foo.call( this ); //inherit static props
//assign some new props
return this;
}
SubFoo.prototype = Object.create(Foo.prototype); // Inherit prototype
SubFoo.prototype.constructor = SubFoo;
これで、いくつかの「クラス」ができたので、いくつかのインスタンスを作成して、それらがインスタンスであるものを見つけます。
var
foo = new Foo()
, subfoo = new SubFoo()
;
alert(
"Q: Is foo an instance of Foo? "
+ "A: " + ( foo instanceof Foo )
); // -> true
alert(
"Q: Is foo an instance of SubFoo? "
+ "A: " + ( foo instanceof SubFoo )
); // -> false
alert(
"Q: Is subfoo an instance of Foo? "
+ "A: " + ( subfoo instanceof Foo )
); // -> true
alert(
"Q: Is subfoo an instance of SubFoo? "
+ "A: " + ( subfoo instanceof SubFoo )
); // -> true
alert(
"Q: Is subfoo an instance of Object? "
+ "A: " + ( subfoo instanceof Object )
); // -> true
その最後の行を参照してください?関数へのすべての「新しい」呼び出しは、Objectから継承したオブジェクトを返します。これは、オブジェクト作成の省略表現を使用する場合にも当てはまります。
alert(
"Q: Is {} an instance of Object? "
+ "A: " + ( {} instanceof Object )
); // -> true
そして、「クラス」定義自体はどうですか?それらのインスタンスは何ですか?
alert(
"Q: Is Foo an instance of Object? "
+ "A:" + ( Foo instanceof Object)
); // -> true
alert(
"Q: Is Foo an instance of Function? "
+ "A:" + ( Foo instanceof Function)
); // -> true
オブジェクトをMULTIPLE型のインスタンスにできることを理解することが重要だと思います。なぜなら、私は(誤って)を使用して、たとえばオブジェクトと関数を区別できると想定しているからですinstanceof
。この最後の例では、関数がオブジェクトであることを明確に示しています。
継承パターンを使用していて、オブジェクトの子孫をダックタイピング以外の方法で確認したい場合にも、これは重要です。
それが探検する人を助けることを願っていますinstanceof
。