2017-01-24 14 views
0

可能性は確かですが、私は運を試してみます。JavaScript - 特定のクラスのインスタンスであるすべてのオブジェクトを取得する

JavaScriptで特定のクラスのインスタンスであるすべてのオブジェクトを見つけることは可能ですか?例えば

var obj1 = new MyClass(); 
var obj2 = new MyClass(); 
var obj3 = new MyClass(); 

私はクラス名 "MyClassの" と応答でGET "OBJ1、OBJ2、OBJ3" に指定します。

どうすればいいですか?

+1

可能な複製(http://stackoverflow.com/questions/ [JavaScriptで指定したタイプのすべてのオブジェクトを取得する方法] 2602800/how-to-get-all-objects-of-given-type-in​​-javascript) –

+0

配列を作成し、インスタンスをその配列に挿入します。 'MyClass.allInstances = []; MyClass.allInstances.push(this); '多くのオブジェクトが作成されると、ある時点でこれらを削除することに注意するか、多くのオブジェクトが作成されたときにメモリに問題が発生する –

+0

MyClassがサードパーティのライブラリであり、 –

答えて

0

私が知る限り、これは動作しません。あなたのオブジェクトを配列に保存し、それを反復してクラスMyClassのすべてのオブジェクトを取得することができます。

var objects = [new MyClass(), new MyClass(), new MyClass()]; 
function getObjectsOfClass(objects, clazz) { 
    var objArr = []; 
    for (var i = 0; i < objects.length; i++) { 
     if (objects[i] instanceof clazz) { 
      objArr.push(objects[i]; 
     } 
    } 
    return objArr; 
} 
+0

MyClassがサードパーティのライブラリで、アクセスできない場合はどうなりますか? –

+0

常にクラスにアクセスする必要があります。どのようにクラスをインスタンス化する必要がありますか?多分この[リンク](http://stackoverflow.com/questions/2602800/how-to-get-all-objects-of-a-given-type-in​​-javascript?noredirect=1&lq=1)も役立ちます。 –

0

この状況を想像してください。

function M(){} 
var m = new M(); 

は、その後、あなたはバン

for(let f in window){ if(window[f] instanceof M){console.log("founded"+f);}} 

ような何かを、あなたのオブジェクトを検索します。

あなたはコンストラクタ

例にいくつかの変更をした場合にのみすることができます

+0

オブジェクトがグローバルスコープ外でインスタンス化されるとどうなりますか? –

+0

明らかに、動作しません。それが一例でした。ただし、スコープをパラメータとして受け入れる関数を作成することはできます。 – kimy82

+0

これは実行するのが非常に高価であるように私は感じる。このようにWindowオブジェクトを反復処理するのは公正な慣習ですか? – Yuschick

0

に役立ちます希望:それthatsの

var MyClassInstances = []; 
var MyClass = function() { //constructor 
    MyClassInstances.push(this); //push the new instance 
} 

!しかし、メモリリークになる可能性があることに注意してください。したがって、オブジェクトが不要な場合は、MyClassInstancesから参照を削除する必要があります。

+0

MyClassがサードパーティ製のライブラリで、アクセスできない場合はどうなりますか? –

0

あなたはこのようにそれを行うことができます。

function MyClass(){}; 
 

 
MyClass.prototype.test = function(){ 
 
    console.log('TEST'); 
 
}; 
 

 
function MyClassFactory(){ 
 
    this.instances = []; 
 
}; 
 

 
MyClassFactory.prototype.create = function(){ 
 
    let tmp = new MyClass(); 
 
    this.instances.push(tmp); 
 
    return tmp; 
 
}; 
 

 
MyClassFactory.prototype.get = function(i){ 
 
    return this.instances[i]; 
 
}; 
 

 
MyClassFactory.prototype.getAll = function(){ 
 
    return this.instances; 
 
}; 
 

 
let factory = new MyClassFactory(); 
 

 
let obj1 = factory.create(); 
 
let obj2 = factory.create(); 
 
let obj3 = factory.create(); 
 

 
let test1 = factory.get(0); 
 

 
let test2 = factory.getAll(); 
 

 
for(let t of test2){ 
 
    t.test(); 
 
} 
 

 
test1.test();

+0

MyClassがサードパーティのライブラリで、アクセスできない場合はどうなりますか? –

+0

問題ではありません。工場コードを書いてください。この例で変更する必要があるのは、createメソッドだけです。そこでは、オブジェクトを適切に初期化するために必要なパラメータを追加する必要があります。 –

+0

あなたが働いているサードパーティ製のライブラリをみんなに伝えることができればいいですか? –

関連する問題