Javascript 动态创建对象和自取消引用

Javascript 动态创建对象和自取消引用,javascript,html,canvas,web,Javascript,Html,Canvas,Web,伙计们。我正在制作一个无止境的跑步器,我需要一些物体从屏幕顶部出来,一旦它们不再可见,就会被摧毁 我创建了“香蕉”类: 和移动功能: Banana.prototype.move = function(){ if (this.pos_y > 500) { //destroy it this.constructor = undefined; //???? } this.height += 0.5; this.width += 0

伙计们。我正在制作一个无止境的跑步器,我需要一些物体从屏幕顶部出来,一旦它们不再可见,就会被摧毁

我创建了“香蕉”类:

和移动功能:

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.update上动态创建它们。我曾考虑使用一个对象数组,但由于我是Javascript新手,我不知道它将如何工作

您可以选择
此的
.parentElement
,使用“链接到父元素”从
文档中删除构造函数创建的
元素

if (this.pos_y > 500) {
    this.banana_image.parentElement.removeChild(this.banana_image)
}

一旦没有其他对象引用它们,对象就会被垃圾收集。因此,要删除香蕉对象,只需将其从引用香蕉的变量、数组或对象中删除即可:

var banana = new Banana();
banana = null; // the banana object will be deleted sooner or later
查看您的代码,最明显的被引用的是
.move()
方法。它可能由
setTimeout()
setInterval()
requestAnimationFrame()
引用。只要删除动画循环中对香蕉.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的属性,然后实现您自己的高级垃圾收集器,在对象不再“活动”时从引用它的任何对象中删除该对象。

您所说的“已销毁”是什么意思?您是否正在尝试从文档
this.pos\u y>500中删除
this.banana\u image
true
?我的意思是删除。一旦它们到达屏幕的边界,我想删除它们。因此,制作一个香蕉数组,并将“banana.move”放在一个while循环中,该循环在数组中运行,一旦所有香蕉都不再出现在屏幕上,它就会停止循环。你认为这样行吗?另外,你知道物体的动态创建吗?知道。那就是我要做的。除非我使用for循环在数组中运行(除非while循环意味着使用while循环来设置动画-在这种情况下,它将不起作用,因为在停止运行javascript代码之前,浏览器无法在屏幕上绘制任何内容。请改为使用setTimeout)。移动数组中的所有对象后,我会运行另一个for循环来检测要从数组中删除(拼接)的对象。不过,我不确定动态创建是什么意思。上面的例子是动态创建。事实上,javascript只支持动态创建(通过
new
或对象文本)。我所说的动态创建是指我希望在创建之间以随机间隔连续创建对象。所以我需要在它到达时创建对象,我认为我唯一能做的就是在游戏更新中,但我不知道表达式会是什么。类似:
myObjects[]=newobject()
myObjects.push()
// 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];