0

我有一组轻量级对象,每个对象都是观察者模式的主题。为了节省内存,当不再观察主题时,我想释放对象的资源并使其从父数组中删除。那么如何从项目本身的代码中要求父对象或数组本身拼接项目呢?我想出的是这样的:

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 时?再次,显得笨拙。

4

1 回答 1

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
 };
于 2013-10-16T16:48:46.967 回答