2013-10-04 4 views
1

Допустим, у меня есть функция:JavaScript экземпляры класса

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

Можно ли получить все экземпляры, созданные этой функции в JavaScript?

+0

Единственный простой способ, о котором я могу думать, это хранить ссылку на любой созданный класс 'Control' в некотором глобальном массиве. Вы бы сделали сохранение в конструкторе 'Control' (функция выше) – Ian

+1

Нет такой вещи, как я знаю. У вас должен быть собственный механизм для сохранения всех экземпляров класса Control. – maketest

+1

nope (без отслеживания их самостоятельно). В противном случае сборщики мусора не могли бы существовать. –

ответ

-1

No.

Тот факт, что вы можете коснуться только объекты, которые имеют явные ссылки на является part of JavaScript security model *.

* Эта модель безопасности не применима в JavaScript в случаях глобальных объектов.

-3
var foo = new Control('bar'); 
console.log(foo.param1); 
+2

Что это касается вопроса? –

0

Просто храните его в глобальном массиве. Было бы похоже на некоторый статический шаблон.

var controls = [] ; //Global array 

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

    controls.push(self); 
} 
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 

Будьте осторожны, хотя, вы будете предотвратить сборщику мусора освободить память любого экземпляра не вызывать уничтожить() на.

0

Как @Ian предложил в своем комментарии вы можете сделать это следующим образом:

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

function Control(value){ 
    // track instances 
    controlInstances.push(this) 
    this.param1 = value; 
    thsi.param2 = value.text; 
} 
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"] 
}); 

Он использует слушатель для обмена данных между простым методом и классом конструктора, а также позволяет вызывать любой метод, который вы хотите, содержащимися в прототипе класса, передавая параметры, если это необходимо ...

p.s. Извините за плохой английский ... :)

+0

'Person.prototype [params.method] .call (self);' = 'self [params.method]()' Когда ваш экземпляр выходит из области видимости, слушатель событий все еще присутствует. – HMR

0

Я использовал нечто подобное в одном из моих проектов, потому что мне нужно, чтобы вызвать метод для всех экземпляров ...

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 Извините за плохой английский ... :) Смотрите, я!

+0

Если вы беспокоитесь о сборщике мусора, я думаю, вам нужно просто добавить метод destroy в прототип класса и отсоединить слушателя от этого объекта. Что вы думаете об этом? –

Смежные вопросы