【问题标题】:How to test the existance of an instance of a class in JavaScript如何在 JavaScript 中测试一个类的实例是否存在
【发布时间】: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 = undefineddog2.destroy() 之间没有太大区别。
  • "如果我们使用 jQuery,我们可以在类中添加 $(this)(0).length 来检测对象是否仍然存在。" - 呃,不,jQuery 不是魔术,而且如果 jQuery 实例仍然存在,它也无法检测到。你可以做的——无论是使用jQuery还是普通的DOM方法——是检测一个元素是否仍然是document的一部分,还是从DOM中删除。如果您正在为 DOM 元素设置动画,这甚至可能是一个合理的解决方案,但我们不知道您的问题是 AnimalAnimate 函数实际上在做什么。 (也应该是 dog2.destroy() 删除元素)。

标签: javascript class object instance exists


【解决方案1】:

在你的情况下,我会使用:

  if (dog) {
    requestAnimationFrame(Animate);
  }

dogundefined 时,这是“假的”。

【讨论】:

  • 这对var dog = new Animal(), cat = new Animal(); 不起作用,因为只有部分对象在 3 秒后被“移除”。
  • @Bergi 我不明白你在说什么。这个问题不只是试图确定变量dog 是否存在值吗?
  • 不,我认为目标是让Animate 确定“当前的Animal 实例”是否仍然存在。如果 OP 只关心一个 dog 变量,他们就不会使用 class
  • @MightyMouse 你能澄清你的问题吗?
【解决方案2】:

我同意 Brad 的解决方案,但作为对原始问题的回答,您可以使用 instanceof 关键字来测试某事物是否是另一个类的实例。

对于您引用的代码:


if (dog instanceof Animal) {
    console.log('1');
    requestAnimationFrame(Animate);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-31
    • 2021-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 2017-04-14
    • 1970-01-01
    相关资源
    最近更新 更多