Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 什么;“私人财产”;在ES6课程上意味着什么?_Javascript_Oop_Private - Fatal编程技术网

Javascript 什么;“私人财产”;在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

我对ES6课程的隐私有点迷茫。我有这门课:

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;
    }
  }
})();