JavaScript 中的私有属性:private field class in ES2015

317 阅读1分钟

前言

最近在写 egg 的拦截器,定义了一些 session

需要私有属性,于是在 TypeSctipt 的环境中下意识地敲了private

不过这当然是假的私有:

class A {
  public a = 1

  private b = 2
}

⬇️(target: ES2015)

"use strict";
class A {
    constructor() {
        this.a = 1;
        this.b = 2;
    }
}

a 和 b 没有毛线不同。

解决

怎么才能写真正的私有呢?

哥们的帮助下,写出了这玩意:

class A {
  public a = 1

  #b = 2
}

⬇️(target: ES2015)

"use strict";
var _A_b;
class A {
    constructor() {
        this.a = 1;
        _A_b.set(this2);
    }
}
_A_b = new WeakMap();

😯 ~

当我尝试在编辑器中访问私有的属性#b:

image.png

延伸

TC39 - proposal class fields:tc39.es/proposal-pr…

github 中的 TC39 class fields 提案:github.com/tc39/propos…

为何需要用 WeakMap 来实现 private:docs.google.com/presentatio…

为何不直接用 private 来修饰私有属性:github.com/tc39/propos…

V8:private and public fields:v8.dev/features/cl…