我正在尝试在JavaScript中创建observer模式(标准库中可能存在一个模式,但我想实现自己的模式)。
我需要一个弱引用容器,以确保侦听器不会保留未使用的函数。我可以使用WeakSet
来执行此操作,但是WeakSet
无法迭代,因此我无法执行for (let l in listeners)
并通知我的听众更改。
我该怎么做才能解决这个问题?在其他语言中,例如Lua,Java,C等,我对此没有任何问题。
我没有使用任何外部库。
const makeObservable = function(obj, value)
{
// Must be a container of weak references.
// But a weakset is not sufficient.
const listeners = new Set();
obj.addListener = function(listener)
{
listeners.add(listener);
};
obj.removeListener = function(listener)
{
listeners.remove(listener);
};
obj.setValue = function(newVal)
{
if (value === newVal) return;
const oldVal = value;
value = newVal;
for (let l of listeners)
{
// Notify all listeners of the change.
l(oldVal, newVal);
}
};
obj.getValue = function()
{
return value;
};
return obj;
};
const obs1 = makeObservable({ }, 5);
const obs2 = makeObservable({ }, 10);
(function()
{
const memory = { };
const lis = function(_, newVal)
{
memory.changed = newVal;
};
// Whenever either changes, update memory.
obs1.addListener(lis);
obs2.addListener(lis);
})();
// 'memory' is out of scope, but still has references pointing to it.
// I have no current way of removing the memory leak until obs1 and obs2 fall out of scope.