Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在JavaScript中实现引用计数?_Javascript_Constructor_Destructor_Javascript Objects_Reference Counting - Fatal编程技术网

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

如何在JavaScript中实现引用计数?,javascript,constructor,destructor,javascript-objects,reference-counting,Javascript,Constructor,Destructor,Javascript Objects,Reference Counting,如何在JavaScript中实现引用计数? 其目的是在创建第一个实例或销毁最后一个实例时触发构造函数/析构函数 我需要实现三种类型的类:抽象类、单例类和普通类(继承类或非继承类) 我试图实现包含所有实例的数组的类ClassDispatcher,但是删除它们并不能删除引用 Module = function(parentModule) { this.destroyInstance = function() { Module.prototype.referenceCo

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

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

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

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

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

你不能。为了实现您所描述的功能,您必须能够在对象即将被垃圾收集或最后一次引用被释放时接收来自JavaScript引擎的回调。没有这样的回调

你的最佳选择:看看你设计的大局,找到一种不需要这样做的方法。新的ES2015和/或对象可能在更大的设计中有用

非常遥远的第二个最佳选择:如果您可以要求对象的用户调用一个方法,例如
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程序中数百万与内存相关的错误)。

ES2015看起来很有希望。有真正的构造函数,但析构函数呢?有没有标准语法,或者我应该自己实现它们?@LukaszB:JavaScript从第一天起就有了真正的构造函数。它没有析构函数或终结器,即使在ES2015中也没有。同样,上面的主要建议是重新设计,这样你就不需要它们了。如果做不到这一点,请强制API的用户调用
destroy
,并为他们做好准备:A)忘记这样做,B)多次这样做。