删除JavaScript对象的实例

时间:2015-09-08 01:22:32

标签: javascript class object instances

我有一个名为box_brick的JavaScript对象:

function box_brick( attribute1, attribute2, etc )
{
    this.attribute_1 = attribute1;
    this.attribute_2 = attribute2;
    this.attribute_etc = etc;

    box_brick.instances.push(this);
}

我通过声明它们来创建新的box_bricks:

var box_62 = new box_brick('new attribute 1', 'new attribute 2', 'etc');

这适用于我的应用程序,并为我提供 box_brick.instances

enter image description here

我的代码设置方式,每次创建一个新框时,我都有 box_brick.instances 中的实例,以及一个独立的对象,我可以直接调用它从中获取信息。例如,要获得 brick_60 的颜色,我可以调用 brick_60.box_color ,在这种情况下,我会收到'#ff008c'。

(这些可能是同一个 - 我仍然有点不清楚对象,实例,类等之间的区别,为此我道歉)

对于我的生活,我无法弄清楚如何从box_brick.instances 删除其中一个box_bricks - 例如,如果我想删除 brick_60 ,所以它不再是在box_brick.instances中,我不确定我会怎么做。

我尝试过brick_60.delete,删除(brick_60);还有很多其他的东西,但我完全被难倒了。

非常感谢任何指导。

4 个答案:

答案 0 :(得分:1)

在ES6中,使用 Set

ES6套装是“袋子”的东西是否存在。与数组不同,您必须迭代以查找具有集合的内容,您可以直接添加和删除项目。它们按照其内容预先编入索引。

// constructor
function box_brick( attribute1, attribute2, etc )
{
    ...
    box_brick.instances.add(this);
                        ^^^^^^^^^      // add to set
}

// initialize set
box_brick.instances = new Set();

// create a new instance
box_brick_instance = new box_brick(...);

// remove it from the set
box_brick.instances.delete(box_brick_instance);
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^    // delete from set

答案 1 :(得分:0)

您正在使用数组,因此您可以执行delete box_brick.instances[0]box_brick.instances.splice(position, 1)

但是,因为您正在使用数组,所以必须使用indexof()来查找box_ID的数组索引才能删除该实例。

让我们尝试使用一个对象,其范围在函数构造函数之外:

// use a dictionary object to hold references to your objects:
var boxes = Object.create(null);

function box_brick(attribute1, attribute2, etc ) {

    this.attribute_1 = attribute1;
    this.attribute_2 = attribute2;
    this.attribute_etc = etc;

    var id = $.now().toString(); // use jQuery to create a unique ID from the UTC timestamp
    boxes[id] = this; // easier to use a unique id to augment object
}

现在删除盒子实例很容易:

function deleteBox(id) {
    if (boxes[id]) delete boxes[id];
}

答案 2 :(得分:0)

由于数组没有以任何特定方式编制索引,因此执行此操作的唯一方法是迭代查找所需的砖块。我可能会建议您将数据结构更改为对象而不是数组,但以下是获取您工作内容的解决方案。

下面是一个deleteID函数,它将迭代并删除具有特定id的元素。在以下示例中,我们删除了id "brick_2"的砖块。

现场演示:

var bricks = [];
bricks.push({box_id: "brick_1"});
bricks.push({box_id: "brick_2"});
bricks.push({box_id: "brick_3"});

function deleteID(id) {
    for (brick in bricks) {
        if (bricks[brick].box_id === id) bricks.splice(brick, 1);
    }
}

deleteID("brick_2");
document.getElementById("output").textContent = JSON.stringify(bricks);
<div id="output"></div>

JSFiddle版本:https://jsfiddle.net/fef3o6vv/

答案 3 :(得分:0)

谢谢大家的帮助 - 我发现elclanrs和Data建议的.splice()函数正是我所希望的。我使用以下代码,效果很好:

for ( var i = 0; i < box_brick.instances.length; i++ )
{

    if ( box_brick.instances[i].box_id == box_to_delete )
    {
        box_brick.instances.splice(i, 1);
    }

}

虽然这不会删除框中的独立var / Object(因此在控制台中,我仍然可以键入 brick_55.attribute 并获取值),我决定只允许那些留在内存中的变量,并使用 box_brick.instances 作为与应用程序相关的所有实际框的“主列表”,而不考虑独立变量版本(包含相同的冗余信息)。

非常感谢你们!在转向StackOverflow之前我沉入了很多很多小时,而你们的指导正是我所需要的。