我只是想知道为什么每个人都说在 javascript 类中使用 WeakMap 而不是 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];
}
}
使用 WeakMap 是否会提高速度或内存?对我来说,在使用 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/