【发布时间】:2020-12-24 17:42:48
【问题描述】:
我有这个:
class Animal {
constructor() {
Animate();
function Animate() {
if (true) { // What do change here for the object to self-check if it still exists?
console.log('1');
requestAnimationFrame(Animate);
}
}
}
}
var dog = new Animal();
setTimeout(function () {
dog = undefined;
// The Animate() should no longer be called at this point.
}, 3000);
如果类的实例不再“存在”...,我如何修改 Animate() 函数以停止再次调用自身...?
感谢您的所有回复。就像下面的一些人所说的,我似乎需要实现某种“销毁”方法来处理和管理类 Animal 实例的 Animate() 函数调用。并不是我真正想要的,因为我更希望实例具有自我意识并知道何时不再需要它。
不确定这是否有助于澄清以下一些问题,但我们可以:
var dog1 = new Animal();
var dog2 = new Animal();
var dog3 = new Animal();
每个实例都将运行自己的Animate()。如果实例设置为 undefined(例如,也可以设置为 null),则不应再调用 Animate() 调用。这里的目标是让对象的实例能够自我意识到它不再需要。创建一个destroy方法意味着我们在外部进行调用,因此实例不是自我感知的。
如果我们使用 jQuery,我们可以在类中添加 $(this)(0).length 来检测对象是否仍然存在。
【问题讨论】:
-
我宁愿不使用 setTimeout ,因为它会迫使浏览器非常努力地工作,以至于性能会随着时间的推移而降低。它肯定必须使用 requestAnimationFrame() 来调用。
-
该对象将继续存在,只要
Animate引用它(它必须),dog变量与此无关。您无法检查您所持有的对象的“存在”。您需要做的是显式设置某种.destroyed标志,或者调用取消动画帧的.stopAnimation()方法。 -
除了@Bergi 已经提到的...对于任何与GUI 相关的类,无论如何都应该考虑为其提供
destroy方法。而且由于一个很可能也有 GUI 元素的子关系和父关系,因此很容易确保/建立整个销毁/解构链。 -
"我希望实例具有自我意识并知道何时不再需要它。" - 这是不可能的。请注意,不是“实例”设置为
undefined,而是当前持有它的一个变量。 “创建销毁方法意味着我们在外部进行调用” - 您想要的dog2 = undefined和dog2.destroy()之间没有太大区别。 -
"如果我们使用 jQuery,我们可以在类中添加
$(this)(0).length来检测对象是否仍然存在。" - 呃,不,jQuery 不是魔术,而且如果 jQuery 实例仍然存在,它也无法检测到。你可以做的——无论是使用jQuery还是普通的DOM方法——是检测一个元素是否仍然是document的一部分,还是从DOM中删除。如果您正在为 DOM 元素设置动画,这甚至可能是一个合理的解决方案,但我们不知道您的问题是Animal的Animate函数实际上在做什么。 (也应该是dog2.destroy()删除元素)。
标签: javascript class object instance exists