前端 JS 经典:如何实现私有字段

前言:方法有很多,但是我们需要择优选择。

1. 命名规范

我们可以通过命名规范实现私有字段,如:下划线

缺点:没有强约束力,我们用了也就用了

class A {
  _key = 1;
}

const a = new A();
a._key; // 1

2. Symbol

使用 Symbol,类里用动态属性来设置。

缺点:没有强约束力,也能直接访问到。

const key = Symbol("key");
class A {
  [key] = 1;

  m() {
    return this[key];
  }
}

const a = new A();
a[key]; // 1

3. TS 的 private

使用 TS 的 private。当我们访问属性时,会报一个编译错误。

缺点:这种检查只在编译时态,在运行时态是没错的。可以通过动态属性,绕过编译时态,一样可以拿到 key。

class A {
  private key = 1;
}

const a = new A();
a.key; // error

4. ES 的新特性

使用 ES 新特性 #,再去访问#key 就会报错了,无论是编译时,还是运行时。但是因为是新出来的,有兼容性问题。

class A {
  #key = 1;
  m() {
    return this.#key;
  }
}

5. WeakMap

将一个类的私有属性都放在 map 里边。为什么要用 WeakMap ? 避免影响垃圾回收。然后将整个类放到一个模块里,只导出类,那么在外部,就只能通过方法 m() 拿到私有属性了。

const privateFields = new WeakMap();

export class A {
  constructor() {
    privateFields.set(this, { key: 1 });
  }
  m() {
    return privateFields.get(this).key;
  }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yqcoder

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值