如何在JavaScript中重用对象?

时间:2009-11-06 02:05:16

标签: javascript memory

我不是JavaScript的新手,但我从来没有真正深入了解它是如何工作的。我目前正在为手机开发一些完全用JavaScript完成的软件。一切都运行良好,除了偶尔垃圾收集器开始,一切都暂时停止。

问题是对象不断被破坏和创建。有许多对象也很相似,但不一样。

解决方案很简单:每当不再需要某个对象时,将其放在一个充当回收站的链表中。每当我们准备创建另一个类似类型的对象(大多数相同属性)时,从列表中获取对象并根据需要进行设置。但是,我对转换部分并不完全确定。

我知道JavaScript中的每个对象本质上只是一个哈希表,但我仍然不确定如何处理这个问题。我将在下面给出一个问题的例子:

var type1 = Class.create({ ... });
var type2 = Class.create({ some of the same properties + some different ones });

现在我有一个未被使用的type1,我想将它用作type2。这样做的最佳方式是什么?

2 个答案:

答案 0 :(得分:3)

这实际上取决于您如何在代码中运行对象。如果你真的很严格,并且在检测对象的类型方面没有做出聪明的事情......那么建议你只是简单地重复使用这些对象就像是鸭子的打字风格一样安全。只需填写缺少的“一些不同的”就足够了。

另一方面,如果您不确定或有代码与对象的属性混合和发出刺痛,例如:

if (obj.color == "white" && obj.legs == 2 && obj.family != "swan")
{
    // we have a duck!
}

然后你需要严格要求“塑造”你的物体。

您实际上可以使用delete语句

从对象中删除“键”
myObj.a = "HELLO";
alert(myObj["a"]); // => alerts "HELLO"

delete myObj.a;
alert(myObj["a"]); // => alerts "undefined"

从中可以使用简单的for循环来“重置”对象,然后再将其重新用作其他内容:

for (var key in myObj)
    delete myObj[key];

您还可以使用if运算符进行简单的差异检查:

var refObj = { /* obj of desired type */ };
var newObj = { /* obj fetched from recycler */ };

for (var key in newObj)
    if (refObj[key] == undefined)  
        delete newObj[key];          // removes alien keys found in newObj
    else
        newObj[key] = refObj[key];   // add/resets keys so it looks like refObj

但是我建议您只重复使用完全相同类型的对象或重新考虑您的类/对象层次结构以避免这种开销。

我觉得做这件事会变得太聪明了。是不是将对象重新循环为JS运行时的工作而不是开发人员?

答案 1 :(得分:1)

回答@Mark评论

基本上,你的对象初始化将是:

var newObj = fetchFromList();

resetBasicParameters(newObj);

newObj.think = function() { /* a new implementation */ };

您可以在多个对象之间共享“新实现”部分,并且仍然可以使用this关键字访问对象内的变量/属性:

function thinkInTriangle() { /* trigonometries */ }
function thinkInRects() { /* geometries */ }
function thinkInPolygons() { /* crazy geometries */ }

function createRect() { return getObjFromPool(thinkInRects); }
function createTriangle() { return getObjFromPool(thinkInTriangle); }
function createPolygon() { return getObjFromPool(thinkInPolygons); }

function getObjFromPool(thinkFunc)
{
    var newObj = fetchFromList();
    resetBasicParameters(newObj);

    newObj.think = thinkFunc
}

每个thinkInX函数在连接到对象实例时都会有this关键字指向它所在的特定对象。所以这基本上意味着think函数可以与任何/所有对象分离,并可以随意操纵。

不确定这是否会有所帮助。等待反馈。