在我目前正在阅读的书中,它讨论了我们如何使用 WeakMap 通过下面的示例代码来强制隐私。
const Car = (function() {
const carProps = new WeakMap();
class Car {
constructor(make, model) {
this.make = make;
this.model = model;
this._userGears = ["P", "N", "R", "D"];
carProps.set(this, { userGear: this._userGears[0] });
}
get userGear() {
return carProps.get(this).userGear;
}
set userGear(value) {
if (this._userGears.indexOf(value) < 0)
throw new Error(`Invalid gear: ${value}`);
carProps.get(this).userGear = value;
}
shift(gear) {
this.userGear = gear;
}
}
return Car;
})();
我无法理解这样的代码如何真正使齿轮属性私有并且不允许从外部访问。
似乎通过使用
carProps.set(this, { userGear: this._userGears[0] });
我们正在隐藏 userGear 并将其设为私有,因此无法访问。
但是,当我使用
const car1 = new Car("Toyota", "Prius");
console.log(car1);
console.log(car1.userGear);
它向我展示了结果
Car {
make: 'Toyota',
model: 'Prius',
_userGears: [ 'P', 'N', 'R', 'D' ] }
P
我不知道为什么我可以访问 userGear 并在此处获取 'P' 而不是 'undefined' 假设它无法访问。
可能我做错了什么或错误地理解了这个概念。
有人可以帮我理解 WeakMap 吗?