==
例を に変更すると、プロトタイプとしてオブジェクトinstanceof
を持つすべてのグローバル変数で機能します。Point
for(key in window) {
if(this[key] instanceof Point){ // <== using instanceof here
console.log(this[key]);
}
}
しかし、 の定義に誤りがありますPoint
。new
後で関数として使用するため、そこには必要ありませんPoint
。しかし、その無名関数をコンストラクターとしてnew function() { }
呼び出し、 によって作成された非関数オブジェクトを返しますnew
。
完全な作業例:ライブ コピー| ライブソース
var Point = function(){};
var Line = function(){};
Line.prototype = new Point();
var lineInstance = new Line();
var pointInstance = new Point();
for(key in window) {
if(window[key] instanceof Point){
console.log(key + " is 'instanceof' Point");
}
}
上記に関する注意事項:
オブジェクトをプロパティとしてLine
使用する関数 (行 ) を見つけることが目標の場合(そのプロパティはオブジェクトのプロトタイプではありませんが、これらの関数を介して作成されたオブジェクトのプロトタイプになることに注意してください)、プロパティを調べます。 :ライブコピー| ライブソースPoint
prototype
new
prototype
for(key in window) {
if(typeof window[key] === "function" &&
window[key].prototype instanceof Point){
console.log(key + " is a function using Point as its prototype property");
}
}
ここでの問題は、オブジェクトのプロトタイプと関数のプロパティの概念を誤解している可能性があると思います。prototype
これらは異なるが関連するものです。
関数のprototype
プロパティはまさにそれです: 関数のプロパティ。
経由で関数を呼び出して(たとえば、コンストラクター関数として使用して)オブジェクトを作成する場合、使用中の呼び出し中に発生することの 1 つは、新しいオブジェクトが作成され、その基になるプロトタイプが割り当てられることです (これには、次のようにアクセスできません)。オブジェクトの任意のプロパティ*) コンストラクター関数のプロパティから。new
new
prototype
これは、次の例で最もよく説明されています。
function Foo() {
}
Foo.prototype.bar = 42;
var f = new Foo();
console.log(f.bar); // "42"
Foo
関数には というプロパティがありますprototype
。を介して新しいオブジェクトを作成するnew Foo
と、そのオブジェクトの基礎となるプロトタイプが から取得Foo.prototype
されます。したがって、そのオブジェクトのプロパティを検索し、独自のコピーがない場合、JavaScript エンジンはプロトタイプを調べて、それがあるかどうかを確認します。したがって、上記の最後の行が機能"42"
し、コンソールにログが記録されます。
(* 上で、オブジェクトの基礎となるプロトタイプには、オブジェクトのどのプロパティとしてもアクセスできないと言いました。標準によると、これは JavaScript にも当てはまります。しかし、多くのエンジンが提供する非標準の拡張、 と呼ばれるプロパティが__proto__
あります。はまさにそれです: オブジェクトの基礎となるプロトタイプ. しかし、それは標準ではありません. 標準内では、オブジェクトを に渡すことでオブジェクトのプロトタイプを取得できますObject.getPrototypeOf
.これは ES5 の新しい機能です.)
そして最後に: これはおそらく単なる使い捨ての例ですが、「is a」関係がない (aは a ではない) ため、通常はLine
から継承することは期待できません。ここでの通常の関係は、継承ではなく合成です。Aはs を持っていますが、aは ではありません。Point
Line
Point
Line
Point
Line
Point