essop封装常用有几种

essop封装常用有几种
最新回答
笑忘书

2022-02-05 03:59:08

ES6 class封装常用方式主要有以下3种,根据项目需求和技术栈选择:

1. 公有封装
默认定义的属性和方法均为公有,可直接通过实例访问:
javascript
class Person {
constructor(name) {
this.name = name // 公有属性
}
greet() { // 公有方法
return `Hello, ${this.name}`
}
}
const user = new Person('John')
console.log(user.name) // 直接访问属性
console.log(user.greet()) // 调用方法


2. 私有封装(#语法)
ES2022正式支持的私有成员方案,使用#前缀定义:
javascript
class BankAccount {
#balance = 0 // 私有属性

constructor(initial) {
this.#balance = initial
}

#validate(amount) { // 私有方法
return amount > 0
}

deposit(amount) {
if(this.#validate(amount)) {
this.#balance += amount
}
return this.#balance
}
}
const acc = new BankAccount(100)
acc.deposit(50) // 正常操作
// acc.#balance // 报错:私有成员不可外部访问


3. WeakMap模拟私有
兼容旧环境的替代方案,通过WeakMap存储私有数据:
javascript
const _data = new WeakMap()

class User {
constructor(name) {
_data.set(this, {
name: name,
id: Math.random().toString(36).slice(2)
})
}

getProfile() {
const {name, id} = _data.get(this)
return {name, id}
}
}
const u = new User('Alice')
u.getProfile() // 获取包含私有数据的对象
// _data.get(u) // 外部无法直接获取WeakMap中的数据


选择建议:现代项目直接使用#语法作为标准方案,需兼容旧环境时可采用WeakMap方案,公有封装仅适用于无需保护数据的简单场景。