繁体   English   中英

如何在JavaScript中重用对象?

[英]How can I reuse objects in JavaScript?

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

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

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

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

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

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

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

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

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运行时的工作而不是开发人员?

回答@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函数从任何/所有对象中分离出来并在遗嘱中进行操作。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM