javascript - 在 es6 类上创建私有(private)成员

标签 javascript ecmascript-6

我只是想知道为什么每个人都说在 javascript 类中使用 Wea​​kMap 而不是 Symbol 来创建私有(private)成员。

更好的地方:

const NAME = new WeakMap();
class foo {
    constructor(name){
        NAME.set(this, name);
    }

    get name(){
        return NAME.get(this);
    }
}

对比:

const NAME = Symbol();
class foo {
    constructor(name){
        this[NAME] = name;
    }

    get name(){
        return this[NAME];
    }
}

使用 Wea​​kMap 是否会提高速度或内存?对我来说,在使用 Symbol 时使用反射的想法将是使用 Symbol 的胜利。所以我想我的问题是为什么 WeakMap 而不是 Symbol?

谢谢

最佳答案

因为符号不是私有(private)的。如果你有一个对象的引用,你可以得到它的符号:

var o = {};
(function trusted() {
  o[Symbol()] = "private data";
})();
o[Object.getOwnPropertySymbols(o)[0]]; // "private data" - Oops!!

相反,如果您将 WeakMap 限制在受信任的闭包中,它们将无法访问:

var o = {};
(function trusted() {
  var wm = new WeakMap();
  wm.set(o, "private data");
})();
// A reference to `o` is not enough to access "private data" :D

但是,请注意它们也不是完全私有(private)的:

var leaked;
(function attacker(_set_ = WeakMap.prototype.set) {
  WeakMap.prototype.set = function(key, value) {
    _set_.apply(this, arguments);
    leaked = value;
  };
})();
(function trusted() {
  var wm = new WeakMap();
  wm.set({}, "private data");
})();
leaked; // "private data" - Oops!!

关于javascript - 在 es6 类上创建私有(private)成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33310837/

相关文章:

javascript - JSDoc + IDE 与 TypeScript

javascript - 浅克隆 Map 或 Set

javascript - 通过 mediawiki API 删除类别

javascript - jQuery UI 日期选择器可以禁用周六和周日(以及节假日)吗?

javascript - 哪些实际产品(网络、移动应用程序等)使用 bacon.js?

javascript - ReactJS onClick 参数没有传递给父组件

javascript - babel 将 `let` 转换为 `var` ,运行时如何知道它应该取决于 block 作用域

javascript - 遍历嵌套的对象数组,呈现不同的标记

javascript - 如何从流中获取数据?

javascript - 为很多D3力模拟节点添加阴影?