1

この例を見てみましょう:

var Point = new function(){};

var Line = function(){};
    Line.prototype = new Point();

var line2 ....

Point のプロトタイプを作成するすべてのエンティティを見つけたいわけではありません。いくつかのコードを試しましたが、機能しません:

for(key in window) {
  if(this[key] == Point){ // typeof is also not working.
     console.log(this[key]);
  }
}
4

2 に答える 2

5

==例を に変更すると、プロトタイプとしてオブジェクトinstanceofを持つすべてのグローバル変数で機能します。Point

for(key in window) {
  if(this[key] instanceof Point){ // <== using instanceof here
     console.log(this[key]);
  }
}

しかし、 の定義に誤りがありますPointnew後で関数として使用するため、そこには必要ありません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");
  }
}

上記に関する注意事項:

  • new一行目にはありません。

  • new Point実際にとを使ってオブジェクトを作成していますnew Line

  • windowループの両方の場所で使用しました。windowある場所で使用しthisて別の場所で使用すると、混乱するだけです (ただし、この場合、両方とも同じオブジェクトを参照します)。


オブジェクトをプロパティとしてLine使用する関数 (行 ) を見つけることが目標の場合(そのプロパティはオブジェクトのプロトタイプではありませんが、これらの関数を介して作成されたオブジェクトのプロトタイプになることに注意してください)、プロパティを調べます。 :ライブコピー| ライブソースPointprototypenewprototype

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 つは、新しいオブジェクトが作成され、その基になるプロトタイプが割り当てられることです (これには、次のようにアクセスできません)。オブジェクトの任意のプロパティ*) コンストラクター関数のプロパティから。newnewprototype

これは、次の例で最もよく説明されています。

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から継承することは期待できません。ここでの通常の関係は、継承ではなく合成です。As を持っていますが、aは ではありません。PointLinePointLine PointLinePoint

于 2013-05-17T21:56:44.927 に答える