基于强引用散列表实现私有变量的一个问题

2018-03-18 21:13:54 +08:00
 vevlins
var Person = (function() {

    var privateData = {},
        privateId = 0;

    function Person(name) {
        Object.defineProperty(this, "_id", { value: privateId++ });

        privateData[this._id] = {
            name: name
        };
    }

    Person.prototype.getName = function() {
        return privateData[this._id].name;
    };

    return Person;
}());

这是我从一个博客粘贴过来的代码,其中博主有这么一句话:‘散列表 privateData 对每个实例都是强引用,导致实例不能被垃圾回收处理。如果存在大量实例必然会导致 memory leak ’。

privateData 引用了实例嘛? 我觉得 privateData 里不是只是 id-name 的映射,name 不也是字符串吗?

2532 次点击
所在节点    JavaScript
3 条回复
MinonHeart
2018-03-18 23:45:37 +08:00
多实例对应单个 privatedata。这种是方便查找 id 对应的数据,否则没必要这样设计。内存泄露,一般不会,除非一直 new person
sunjourney
2018-03-19 01:25:49 +08:00
尽信书不如无书,这样用没问题的。哪怕 name 是个对象也没问题,实例销毁 privateData 也没引用了
vevlins
2018-03-19 12:12:16 +08:00
@MinonHeart 我觉得 privatedata 内没有引用实例,只是存储了它的_id,这个想法对吗

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/439177

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX