gpt4 book ai didi

javascript - 如何在 JavaScript 中实现引用计数?

转载 作者:行者123 更新时间:2023-11-30 16:25:34 24 4
gpt4 key购买 nike

如何在 JavaScript 中实现引用计数?目的是在创建第一个实例或销毁最后一个实例时触发构造函数/析构函数。

我需要实现三种类:抽象类、单例类和普通类(继承或不继承)。

我尝试实现包含所有实例数组的 ClassDispatcher 类,但删除它们并不会删除引用...

Module = function(parentModule)
{
this.destroyInstance = function()
{
Module.prototype.referenceCounter--;
}
this.initInstance = function()
{
Module.prototype.referenceCounter++;
}

this.initInstance();
}
Module.prototype.referenceCounter = 0;

最佳答案

你不能。为了执行您所描述的操作,当对象即将被垃圾收集或释放对其的最后一个引用时,您必须能够从 JavaScript 引擎接收回调。没有这样的回调。

您的最佳选择:着眼于设计的大局,找到一种不需要这样做的方法。新款ES2015WeakMap和/或 WeakSet对象可能在更大的设计中有用。

非常遥远第二佳替代方案:如果您可以要求对象的用户调用方法,例如destroy,当他们认为已经完成了对对象的引用时,您可以这样做,但是由于使用错误(未能调用destroy),这非常很容易失败。

这是非常容易失败的示例:

var CountedThing = (function() {
var instances = 0;

function CountedThing() {
if (!this.hasOwnProperty("destroyed")) {
++instances;
this.destroyed = false;
if (instances === 1) {
// First instance created
}
}
}

CountedThing.prototype.destroy = function() {
if (!this.destroyed) {
this.destroyed = true;
--instances;
if (instances === 0) {
// Last instance "destroyed"
}
}
}

return CountedThing;
})();

但同样,这非常容易失败。它可以工作(看看任何编写良好的C程序,它必须以类似的方式管理其内存),但正确地做到这一点是很棘手的(看看C中数以百万计的与内存相关的错误)程序)。

关于javascript - 如何在 JavaScript 中实现引用计数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34175830/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com