在es6类上创建私人成员

weagle08

我只是想知道为什么每个人都说要使用WeakMap over Symbol在javascript类中创建私有成员。

更好的是:

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];
    }
}

使用WeakMap可以提高速度或改善内存吗?对我来说,在使用Symbol时可以使用反射的想法将是使用Symbol的胜利。所以我想我的问题就是为什么WeakMap超过Symbol?

谢谢

i

因为符号不是私有的。如果您有对一个对象的引用,则可以获取其符号:

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

相反,如果将WeakMaps限制在一个受信任的闭包中,则将无法访问它们:

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

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

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!!

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在es6类上创建私人成员

来自分类Dev

ES6类中的成员变量

来自分类Dev

从函数创建ES6类

来自分类Dev

创建一个从ES6 Map扩展的类

来自分类Dev

如何为 ES6 类创建“字段”(React 示例)

来自分类Dev

如何将具有成员变量的React组件重构为es6类

来自分类Dev

在es6 javascript类的非静态成员函数中调用静态getter

来自分类Dev

嵌套的ES6类?

来自分类Dev

ES6类的范围

来自分类Dev

ES6 JavaScript 类

来自分类Dev

创建一个使用es6类语法将Function对象作为实例创建的类

来自分类Dev

创建一个使用es6类语法将Function对象作为实例创建的类

来自分类Dev

C ++访问朋友类中的私人成员

来自分类Dev

C ++访问朋友类中的私人成员

来自分类常见问题

如何在ES6类中创建“公共静态字段”?

来自分类Dev

如何为ES6类React组件创建Chai / Mocha单元测试?

来自分类Dev

在ES6中使用动态名称创建类的实例?

来自分类Dev

在ES6中使用动态名称创建类的实例?

来自分类Dev

从父级创建子级(JavaScript中的ES6类)

来自分类Dev

ES6:使用.next()属性创建类(将值添加到属性字段)

来自分类Dev

如何在 ES6 类构造函数中创建和填充二维数组

来自分类Dev

为什么箭头函数可以用在 ReactJS 类上,而不能用在纯 ES6 类上?

来自分类Dev

使用ES6类的快速路由

来自分类Dev

从非类继承ES6 / TS类

来自分类Dev

ES6类文字中的IIFE

来自分类常见问题

从库中模拟ES6类

来自分类Dev

使用ES6类反应静态

来自分类Dev

如何枚举ES6类方法

来自分类Dev

ES6类构造函数参数