Допустим, у меня есть функция:JavaScript экземпляры класса
function Control(value){
var self=this;
self.param1=value;
self.param2=value.text;
}
Можно ли получить все экземпляры, созданные этой функции в JavaScript?
Допустим, у меня есть функция:JavaScript экземпляры класса
function Control(value){
var self=this;
self.param1=value;
self.param2=value.text;
}
Можно ли получить все экземпляры, созданные этой функции в JavaScript?
No.
Тот факт, что вы можете коснуться только объекты, которые имеют явные ссылки на является part of JavaScript security model *.
* Эта модель безопасности не применима в JavaScript в случаях глобальных объектов.
var foo = new Control('bar');
console.log(foo.param1);
Что это касается вопроса? –
Просто храните его в глобальном массиве. Было бы похоже на некоторый статический шаблон.
var controls = [] ; //Global array
function Control(value){
var self = this;
self.param1=value;
self.param2=value.text;
controls.push(self);
}
Не изменяя класс, вы можете сделать это немного. Если вы можете изменить его, просто сохранить ссылку каждого экземпляра вы строите:
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
Будьте осторожны, хотя, вы будете предотвратить сборщику мусора освободить память любого экземпляра не вызывать уничтожить() на.
Как @Ian предложил в своем комментарии вы можете сделать это следующим образом:
// global are bad though!
var controlInstances = [];
function Control(value){
// track instances
controlInstances.push(this)
this.param1 = value;
thsi.param2 = value.text;
}
я использовал нечто подобное в одном из моих проектов, потому что мне нужно, чтобы вызвать метод для всех экземпляров ...
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. Извините за плохой английский ... :)
'Person.prototype [params.method] .call (self);' = 'self [params.method]()' Когда ваш экземпляр выходит из области видимости, слушатель событий все еще присутствует. – HMR
Я использовал нечто подобное в одном из моих проектов, потому что мне нужно, чтобы вызвать метод для всех экземпляров ...
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 Извините за плохой английский ... :) Смотрите, я!
Если вы беспокоитесь о сборщике мусора, я думаю, вам нужно просто добавить метод destroy в прототип класса и отсоединить слушателя от этого объекта. Что вы думаете об этом? –
Единственный простой способ, о котором я могу думать, это хранить ссылку на любой созданный класс 'Control' в некотором глобальном массиве. Вы бы сделали сохранение в конструкторе 'Control' (функция выше) – Ian
Нет такой вещи, как я знаю. У вас должен быть собственный механизм для сохранения всех экземпляров класса Control. – maketest
nope (без отслеживания их самостоятельно). В противном случае сборщики мусора не могли бы существовать. –