人。我制作了一个无尽的跑步者,我需要一些物体来自屏幕顶部,然后在它们不再可见时被摧毁。
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的新手,我不知道它是如何工作的。
答案 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
这样的属性,然后实现自己的高级垃圾收集器,以便在它不再“活着”时从引用它的任何东西中删除该对象。