在带有 # 前缀的类中声明的任何属性都被视为私有属性。但是 Javascript 设计中没有私有属性的概念。但是,我们可以通过在函数外部定义私有属性然后在函数内部使用它们来模拟私有属性。这样,除非我们导出,否则这些属性无法在模块外部访问。因此,上述代码的转译版本将是这样的。
var _a = /*#__PURE__*/new WeakMap();
var A = function A() {
_classCallCheck(this, A);
_a.set(this, {
writable: true,
value: 1
});
};
如您所见,#a 变量被转换为 _a 并在函数外部声明为 WeakMap 并在函数内部使用。
因此,如果您有另一个具有相同名称的静态属性,#a
它会尝试在函数外部创建另一个具有相同名称的变量 _a。由于它是私有静态属性,因此不会附加到函数。所以转译后的代码将如下所示。
var _a = /*#__PURE__*/new WeakMap();
var A = function A() {
_classCallCheck(this, A);
_a.set(this, {
writable: true,
value: 1
});
};
var _a = {
writable: true,
value: 2
};
如您所见,它尝试创建另一个具有相同名称的变量并引发错误。这是 javascript 的限制,可以通过明显地给出不同的名称来轻松避免。
后一种情况是有效的,因为它们不是私有属性。