Skip to content

约定俗成的规范约束

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 p
javascript
// 作用域 私有
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

made with ❤️ by ankang