三种方法。闭包、symbol、#
//核心代码
let obj = {
name: 'lisi',
getName() {
return this.name
}
}
console.log(obj.name) //输出lisi,可以访问
console.log(obj.getName()) //输出lisi,可以访问
//实现属性的私有化就是通过obj.name访问不到name的属性
1.symbol,用symbol作为属性。
let _privateKey = Symbol('name')
let obj = {
[_privateKey]: 'lisi',
getName() {
return this[_privateKey]
}
}
console.log(obj.name) //输出lisi,undefined
console.log(obj.getName()) //输出lisi,可以访问
//此处有一个问题,console.log(obj[_privateKey])还是可以访问到的,所以使用#私有字段(ES2020提案)
class MyClass {
#privateField = 'private';
getPrivateField() {
return this.#privateField;
}
}
const instance = new MyClass();
console.log(instance.getPrivateField()); // 输出 'private'
console.log(instance.#privateField); // SyntaxError: Private field '#privateField' must be declared in an enclosing class