Javascript 什么;“私人财产”;在ES6课程上意味着什么?
我对ES6课程的隐私有点迷茫。我有这门课:Javascript 什么;“私人财产”;在ES6课程上意味着什么?,javascript,oop,private,Javascript,Oop,Private,我对ES6课程的隐私有点迷茫。我有这门课: class Whatever { constructor(value) { this._value = Number(value); } total() { return this._value * 2; } } let instance = new Whatever('1000'); console.log(i
class Whatever {
constructor(value) {
this._value = Number(value);
}
total() {
return this._value * 2;
}
}
let instance = new Whatever('1000');
console.log(instance.total() ); // 2000
console.log(instance._value ); // 1000
我试图学习Symbol()如何保持数据私有(),在阅读文档后,我试图给出一个简单的示例,但似乎没有任何区别:
const _value = Symbol('value');
class Whatever {
constructor(value) {
this[_value] = Number(value);
}
total() {
return this[_value] * 2;
}
}
let instance = new Whatever('1000');
console.log(instance.total() ); // 2000
console.log(instance[_value] ); // 1000
有人能全面地向我解释一下,在这个案例中,隐私意味着什么,以及为什么我的数据私有化(使数据在课堂之外不可接受)的想法是错误的?我在OOP方面没有太多经验
多谢各位 这里有一些微妙的概念在起作用
Symbol
s是全局唯一的;也就是说,如果调用Symbol.create('somestring')代码>两次,它将产生两个完全不同的符号
如果“其他人”无法以其他方式访问其键为符号**的对象属性,则无法访问该符号。在第二个示例中,类下面的代码仍然可以通过词法访问符号。但是,如果您的类要导出,无论是通过模块系统导出,还是仅仅返回到没有词法访问的其他调用函数,即使他们知道您用来标记符号的字符串,也不会是这种情况,因为他们无法重新创建它(如上所述)
**编辑2:如其他人所述,包括Rauschmayer博士,“其他人”可以通过Reflect.ownKeys(object)
访问键,包括符号。在这件经过深思熟虑的案件中,人们希望对方知道他们在做什么。。。因此,使用符号作为键的整个范例仍然有助于确保键的名称空间不冲突(例如,如果其他人希望在不意外覆盖其任何重要“内部”属性的情况下扩展对象)。但是,这还不足以100%防止故意访问或修改。(作品中有一篇相关文章,读起来很有趣。)
编辑:这里有一个例子
let Whatever=(函数(){
常量值=符号(“值”);
什么课都行{
构造函数(值){
此[_值]=数字(值);
}
总数(){
返回此[_值]*2;
}
}
回报一切;
})(); // 生活
让instance=newwhich('1000');
console.log(instance.total());//2000
console.log(实例._值);//未定义
console.log(实例[_值]);//ReferenceError:_值未定义
假设未循环遍历类的可枚举属性,则示例中没有实际差异
考虑以下几点:
function MyFunction () {
const _private = new Symbol();
this[_private] = 5;
this.public = 10;
}
const thing = new MyFunction();
for (let key in thing) { // prints 10
console.log(thing[key]);
}
console.log(thing.public); // prints 10
console.log(thing._private); // undefined
由符号命名的属性是不可枚举的,因此在某种意义上它们不是“公开的”。符号的另一个好处是,它们保证创建唯一的键,因此不必担心键名冲突
为了简单起见,我选择用函数而不是类来说明它。对于类,您可以执行以下操作(这都是关于“保护”符号的范围):
免责声明:这不是“真正的”隐私,因为仍然有方法列举符号。我认为最大的优势是名字冲突。@leum-Ah,你说得对。因此,这将是另一方的深思熟虑,而不仅仅是试图防止名称冲突。谢谢你的指点,我会把我的答案更新为笔记。非常感谢,谢谢。我已经将另一个答案标记为两个都是有效的,但最古老的答案是另一个。这是一样的,正如链接文章所提到的:它们(都)“在某种程度上对外部世界隐藏,但并不完全”。
const MyClass = (function () {
const _value = Symbol();
return class _MyClass {
constructor() {
this[_value] = 5;
}
}
})();