Javascript对象数组 - 自杀破坏

时间:2013-10-16 16:41:21

标签: javascript arrays class object destroy

我有一个轻量级对象数组,每个对象都是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时?再一次,看起来很笨拙。

1 个答案:

答案 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
 };