我有一个轻量级对象数组,每个对象都是Observer模式的主题。为了节省内存,当不再观察Subject时,我想释放对象的资源并使其从父数组中移除。那么我如何要求父对象或数组本身从项目本身的代码中拼接项目?我想出的是:
var parentObj = {
items : [],
addItem : function () {
var newItem = new ItemObj;
items.push(newItem);
},
removeItem : function (item) {
for (var i = this.items.length; i--; i < 0) {
if (this.items[i] == item) {
this.items.splice(i, 1);
return;
}
}
}
};
function ItemObj() {}
ItemObj.prototype = {
observers : [],
observerRemove : function(observer){
//find observer in observers array and splice it out
....
//now here's the part where it gets tricky
if (this.observers.length == 0) {
parentObj.removeItem(this);
}
},
//observerAdd.... etc
};
哪个有效,但只是因为parentObj是一个命名变量,如果它是一个类,它就不那么容易了。而且,这似乎有点笨拙。如果ItemObj可以对它的父Array对象有一些引用会很好,但是我找不到它。有什么建议?也许从parentObj传递一个引用到每个ItemObj?如在
newItem.parentArray = this.items;
创建itemObj时?再一次,看起来很笨拙。
答案 0 :(得分:2)
为什么不在项目类中添加对父项的引用。
var parentObj = {
items : [],
addItem : function () {
var newItem = new ItemObj;
newItem.parent = this; // set the parent here
items.push(newItem);
},
removeItem : function (item) {
for (var i = this.items.length; i--; i < 0) {
if (this.items[i] == item) {
this.items.splice(i, 1);
return;
}
}
}
};
function ItemObj() {}
ItemObj.prototype = {
parent: null,
observers : [],
observerRemove : function(observer){
//find observer in observers array and splice it out
....
//now here's the part where it gets tricky
if (this.observers.length == 0) {
this.parent.removeItem(this); // use the parent here
}
},
//observerAdd.... etc
};