动态创建对象并自我引用

时间:2016-07-30 06:51:37

标签: javascript html canvas web

人。我制作了一个无尽的跑步者,我需要一些物体来自屏幕顶部,然后在它们不再可见时被摧毁。

Screenshot of how it looks like right now

我创建了班级"香蕉":

function Banana() {
    this.height = 1.96;
    this.width = 3.955;
    this.pos_x = 300;
    this.pos_y = -30;
    this.banana_image = new Image();
    this.banana_image.src = 'img/banana.png';
};

移动功能:

Banana.prototype.move = function(){
    if (this.pos_y > 500) {
        //destroy it
        this.constructor = undefined; //????
    }
    this.height += 0.5;
    this.width += 0.5;
    this.pos_y += 5;
    this.pos_x -= 2.2;
};

我在Game.Initialize函数中创建了对象,但它只运行一次,所以它并没有真正帮助我。

我希望能够在我的Game.update上动态创建它们。我正在考虑使用一系列对象,但由于我是Javascript的新手,我不知道它是如何工作的。

2 个答案:

答案 0 :(得分:1)

您可以选择.parentElement this.banana_image,使用链接到父元素的Node.removeChild()来移除<img>

中构造函数中创建的document元素
if (this.pos_y > 500) {
    this.banana_image.parentElement.removeChild(this.banana_image)
}

答案 1 :(得分:1)

一旦没有别的东西引用它们,对象就会被垃圾收集。因此,要删除Banana对象,只需从引用香蕉的任何变量或数组或对象中删除它:

var banana = new Banana();
banana = null; // the banana object will be deleted sooner or later

查看代码,引用最明显的是.move()方法。它可能由setTimeout()setInterval()requestAnimationFrame()引用。只需删除动画循环中对banana.move()的任何引用,该对象迟早会被销毁。

可能引用该对象的其他内容是DOM对象。但那只有你做的事情才会发生:

document.getElementById('banana_image').obj = banana;

通常,大多数人会反过来使用链接:对象将引用DOM对象。这不会阻止对象被垃圾收集,因为唯一的要求是没有其他东西引用该对象。

不要忘记销毁不再使用的DOM对象(如香蕉图像),因为它们不会与对象一起被垃圾收集。原因是还有一些引用它们的东西:浏览器窗口绘制它们。

自我删除

使自我删除工作的唯一方法是使香蕉对象知道引用它的事物。这仅适用于数组和对象。简单的变量不会起作用。它必须是这样的:

function Banana(parent) {
    this.parent = parent;
    /* ... */
}

自我反应:

// if parent is array:
var i = this.parent.indexOf(this);
this.parent.splice(i,i);

// if parent is object:
delete this.parent[this.parent_key];

虽然我之前写过类似的东西,但我认为它是一种反模式。更好的解决方案是拥有像this.alive这样的属性,然后实现自己的高级垃圾收集器,以便在它不再“活着”时从引用它的任何东西中删除该对象。