Хорошо, сначала я знаю, что объект не имеет ссылки на его контейнер, если явно не определено, поэтому я ищу работу здесь.Доступ к родительскому объекту
Возьмем следующий код (сильно упрощенным от моего случая использования для удобства чтения):
var cid = 0;
var Command = function(c) {
this.id = cid += 1;
this.transient = false;
return this;
}
var sid = 0;
var CommandSet = function() {
this.id = sid += 1;
this.commands = [];
this.transients = 0;
return this;
}
CommandSet.prototype.parent = null;
CommandSet.prototype.recurse = function(callback) {
callback.call(this);
if (this.parent instanceof CommandSet) {
this.parent.recurse(callback);
}
}
CommandSet.prototype.createSubset = function() {
var set = new CommandSet();
set.parent = this;
set.commands = this.commands;
set.transients = this.transients;
return set;
}
CommandSet.prototype.addCommand = function(c) {
if (c instanceof Command) {
this.commands.push(c);
if (c.transient) {
this.recurse(function() {
this.transients++;
});
}
}
return this;
}
CommandSet.prototype.toggleTransient = function(c) {
if (c instanceof Command) {
c.transient = true;
this.recurse(function() {
this.transients++;
});
}
return this;
}
Если я после этого сделайте следующее (http://jsfiddle.net/5KGd8/1/):
var s1 = new CommandSet();
var c1 = new Command();
var c2 = new Command();
s1.addCommand(c1).addCommand(c2);
var s2 = s1.createSubset();
var s3 = s1.createSubset();
s2.toggleTransient(c1);
console.log(s1);
console.log(s2);
console.log(s3);
s1
теперь имеет 1 преходящее, s2
теперь имеет 1 переходный период, но s3
все еще не имеет ни одного, несмотря на то, что содержит ссылку на те же объекты Command
.
Возможные решения:
Я мог бы построить ссылку в каждую команду, которая хранит все наборы он расположен внутри и перебирать те, однако это собирается вызвать серьезные проблемы с памятью поскольку реальная природа моего приложения требует, чтобы подмножества могли быть собраны в мусор (пользователь будет создавать много из них анонимно часто, не осознавая этого), и это сохранит ссылку на них после их использования. Ссылка
parent
прекрасна, так как я хочу, чтобы родительский набор существовал до тех пор, пока у него есть выжившее подмножество.Я не мог явно заставить пользователя запустить функцию удаления на подмножества, когда он больше не нужен, который будет удалить все внутренние ссылки на него нет, но это усложняет вещи для их, и мне нравится то, чтобы работать автоматически. Природа моего приложения означает, что я хотел бы, чтобы пользователь создавал подмножества в моменты, когда они, возможно, даже не понимали, что они это сделали (через другие функции, которые создают и выполняют на подмножествах).
Может кто-нибудь подумать над тем, как решить эту проблему без проблем, описанных в моих двух решениях?
Почему вы возвращаете это из функций, называемых конструкторами? –
@BenjaminGruenbaum нет причина ... без причины. –
Хорошо, просто для уточнения - вы хотели бы выяснить количество переходных процессов команды (не уверен, что это означает) на основе всех надмножеств, в которых он входит? –