1

関数があるとしましょう:

function Control(value){
    var self=this;
    self.param1=value;
    self.param2=value.text;
}

JavaScript でその関数によって作成されたすべてのインスタンスを取得することは可能ですか?

4

7 に答える 7

4

クラスを変更しなければ、できることはほとんどありません。変更できる場合は、作成する各インスタンスの参照を保持するだけです。

function Control(value){
    Control.instances = Control.instances || [];
    Control.instances.push(this);

    var self=this;
    self.param1=value;
    self.param2=value.text;
}

// In case you are worried about garbage collection
Control.prototype.destroy = function() {
    var index = Control.instances.indexOf(this);
    Control.instances.splice(index, 1);
}


// Usage:
var x = new Control();
var y = new Control();
// do stuff with x and y
console.log('There are ' + Control.instances.length + ' instances of Control');
// all done with x and y
x.destroy();
x = null;
y.destroy();
y = null;
// no more references to the two instances, they can be garbage collected

ただし、destroy() を呼び出さないインスタンスのメモリをガベージ コレクターが解放するのを防ぐことができることに注意してください。

于 2013-10-04T14:45:33.240 に答える
1

すべてのインスタンスのメソッドを呼び出す必要があったため、プロジェクトの 1 つで同様のものを使用しました...

function Person(firstname, lastname) {
    var self = this; // For reference to "this" 
    this.firstname = firstname;
    this.lastname = lastname;


    document.addEventListener( "event/person", function( event ) {
        var params = event.detail.params;
        Person.prototype[ params.method ].call(self);

       // Take params:   params.params => ["param1", "param2", "param3"]
    });
}


Person.prototype.toString = function() {
    console.log("Firstname: " + this.firstname + " Lastname: " + this.lastname);  
};


Person.prototype.callAll = function( params ) {
    document.dispatchEvent( new CustomEvent( "event/person", {
        detail: {
            "params": params   
        }
    }));
};


var a = new Person("Gabriel", "Gatu");
var b = new Person("Marco", "Giovannini");


Person.prototype.callAll({
    method: "toString",
    params: ["param1", "param2", "param3"]
});

リスナーを使用して単純なメソッドとコンストラクタークラスの間で通信し、必要に応じてパラメーターを渡して、クラスのプロトタイプに含めたいメソッドを呼び出すこともできます...

ps悪い英語でごめんなさい... :)

于 2014-04-30T10:27:41.653 に答える
0

@Ian が彼のコメントで示唆したように、次の方法で実行できます。

// global are bad though!
var controlInstances = [];

function Control(value){
    // track instances
    controlInstances.push(this)
    this.param1 = value;
    thsi.param2 = value.text;
}
于 2013-10-04T14:47:16.913 に答える
0

すべてのインスタンスのメソッドを呼び出す必要があったため、プロジェクトの 1 つで同様のものを使用しました...

function Person(firstname, lastname) {
    var self = this; // For reference to "this" 
    this.firstname = firstname;
    this.lastname = lastname;


    document.addEventListener( "event/person", function( event ) {
        var params = event.detail.params;
        Person.prototype[ params.method ].call(self);

       // Take params:   params.params => ["param1", "param2", "param3"]
    });
}


Person.prototype.toString = function() {
    console.log("Firstname: " + this.firstname + " Lastname: " + this.lastname);  
};


Person.prototype.callAll = function( params ) {
    document.dispatchEvent( new CustomEvent( "event/person", {
        detail: {
            "params": params   
        }
    }));
};


var a = new Person("Gabriel", "Gatu");
var b = new Person("Marco", "Giovannini");


Person.prototype.callAll({
    method: "toString",
    params: ["param1", "param2", "param3"]
});

リスナーを使用して単純なメソッドとコンストラクタークラスの間で通信し、必要に応じてパラメーターを渡して、クラスのプロトタイプに含めたいメソッドを呼び出すこともできます...

ps 下手な英語でごめんなさい... :) またね!

于 2014-04-30T10:42:56.053 に答える
-1

いいえ。

明示的に参照しているオブジェクトのみを操作できるという事実は、JavaScript セキュリティ モデルの一部です*.

*グローバル オブジェクトの場合、そのセキュリティ モデルは JavaScript には適用されません。

于 2013-10-04T14:42:11.893 に答える