gpt4 book ai didi

javascript - "private property"在 ES6 类中意味着什么?

转载 作者:行者123 更新时间:2023-11-29 23:45:21 25 4
gpt4 key购买 nike

我对类上的 ES6 隐私有(private)点迷茫。我有这个类:

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() 如何工作以保持数据的私密性(see link),并且在阅读文档后我正在尝试对此做一个简单的示例,但似乎没有任何区别:

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

有人可以全面地向我解释一下,隐私在这种情况下意味着什么,以及为什么我将数据私有(private)化(使类外无法访问数据)的想法是错误的?我在 OOP 方面经验不多。

谢谢。

最佳答案

假设您不遍历类的可枚举属性,您的示例没有真正的区别。

考虑以下几点:

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

由符号命名的属性是不可枚举的,因此在某种意义上它们不是“公开的”。符号的另一个好处是它们可以保证创建唯一的键,因此不用担心键名冲突。

为了简单起见,我选择用一个函数而不是一个类来说明它。对于一个类,您可以执行以下操作(都是关于“保护”符号的范围):

const MyClass = (function () {
const _value = Symbol();
return class _MyClass {
constructor() {
this[_value] = 5;
}
}
})();

免责声明:这不是“真正的”隐私,因为仍然有办法枚举符号。我认为最大的优势是名称冲突。

关于javascript - "private property"在 ES6 类中意味着什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44379121/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com