如何在JavaScript中实现引用计数?
How to implement reference-counting in JavaScript?
如何在JavaScript中实现引用计数?
目的是在创建第一个实例或销毁最后一个实例时触发构造函数/析构函数。
我需要实现三种classes:abstract、singleton、normal(继承与否)。
我已尝试实现 class 包含所有实例数组的 ClassDispatcher,但删除它们不会删除引用...
Module = function(parentModule)
{
this.destroyInstance = function()
{
Module.prototype.referenceCounter--;
}
this.initInstance = function()
{
Module.prototype.referenceCounter++;
}
this.initInstance();
}
Module.prototype.referenceCounter = 0;
你不能。为了执行您所描述的操作,您必须能够在对象即将被垃圾收集或释放对其的最后一次引用时从 JavaScript 引擎接收回调。没有这样的回调。
你最好的选择:看看你设计的大图,找到一种不需要这样做的方法。新的 ES2015 WeakMap
and/or 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中实现引用计数? 目的是在创建第一个实例或销毁最后一个实例时触发构造函数/析构函数。
我需要实现三种classes:abstract、singleton、normal(继承与否)。
我已尝试实现 class 包含所有实例数组的 ClassDispatcher,但删除它们不会删除引用...
Module = function(parentModule)
{
this.destroyInstance = function()
{
Module.prototype.referenceCounter--;
}
this.initInstance = function()
{
Module.prototype.referenceCounter++;
}
this.initInstance();
}
Module.prototype.referenceCounter = 0;
你不能。为了执行您所描述的操作,您必须能够在对象即将被垃圾收集或释放对其的最后一次引用时从 JavaScript 引擎接收回调。没有这样的回调。
你最好的选择:看看你设计的大图,找到一种不需要这样做的方法。新的 ES2015 WeakMap
and/or 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 程序中的错误)。