约定俗成的规范约束
javascript
const key = '__name';
const key2 = Symbol('age');
class Person {
[key] = 'John Doe';
[key2] = 18;
}
const p = new Person();
// 1. 规范约束,但是还是能拿到 比如__命名
console.log(p[key]); // John Doe
console.log(p[key2]); // 18模块约束
javascript
const key = '__name';
const key2 = Symbol('age');
class Person {
[key] = 'John Doe';
[key2] = 18;
}
const p = new Person();
export default pjavascript
// 作用域 私有
import p from './index.js';
console.log(p);
console.log(p[key]); // error报错 拿不到key
// 但是 还是可以拿到key
console.log(p[Object.getOwnPropertyNames(p)[0]]); // John Doe
console.log(p[Object.getOwnPropertySymbols(p)[0]]); // 18属性不在实例上,无论怎么都获取不到
javascript
const weakMapData = new WeakMap()
class Person {
constructor() {
weakMapData.set(this, {
name: 'zhangsan',
})
}
getData() {
return weakMapData.get(this).name
}
}
let p = new Person()
console.log(p.getData()) // zhangsan
// name 是私有的 不能被外部访问 因为就不在实例上
console.log(p.name); // undefined#语法
javascript
class Person {
name = 'zhangsan'
age = 18
#sex = '男' // 私有属性 存在兼容性问题
}
let p = new Person()
console.log(p.name); // zhangsan
console.log(p.age); // 18
console.log(p.#sex); // Uncaught SyntaxError: Private field '#sex' must be declared in an enclosing class