在 ES9,也就是 ECMAScript 2018 中,JavaScript 支持了一个新特性——私有属性。私有属性指的是类的属性只能在类内部访问,外部访问时会报错。这个特性在实际开发中非常实用,可以避免不小心修改了其他开发者不希望被修改的属性。
下面我们来介绍如何在 ES9 中创建具有私有属性的类。
使用井号(#)来定义私有属性
在 ES9 中,可以使用井号(#)来定义私有属性。它只能出现在 class 中,并且在属性名前加上井号即可:
-- -------------------- ---- ------- ----- ------ - ------ ----------------- - ---------- - ----- - --- ------ - ------ ----------- - -
在上面的例子中,我们定义了一个 Person
类,它有一个私有属性 #name
。构造函数接收一个参数 name
,并将其设置为私有属性的值。我们还定义了一个 name
的 getter 方法,它返回私有属性 #name
。
注意,私有属性的名称必须以井号(#)开头,否则会被认为是普通公有属性。
访问私有属性
私有属性只能在类内部访问。在类的方法中,可以直接访问私有属性。在类外部,访问私有属性会报错:
const person = new Person('Tom'); console.log(person.name); // 输出 "Tom" console.log(person.#name); // 报错:SyntaxError: Private field '#name' must be declared in an enclosing class
在上面的例子中,我们首先实例化了 Person
类,并调用了 name
getter 方法,输出了 Tom
。然后,我们尝试直接访问私有属性 #name
,结果会报错。
使用 WeakMap 来实现私有属性
在 ES9 之前,我们也可以实现类似的私有属性功能。一种常用的方法是使用闭包和 WeakMap。
-- -------------------- ---- ------- ----- ------ - ----------- - ----- ------------ - --- ---------- ----- ------ - ----------------- - ---------------------- - ---- --- - --- ------ - ------ ---------------------------- - - ------ ------- -----
在上面的例子中,我们使用了一个闭包来创建一个私有的 WeakMap 对象,用于存储私有属性。在构造函数中,我们使用 privateProps.set
方法来设置私有属性。在 name
getter 方法中,我们使用 privateProps.get
方法来获取私有属性。
使用 WeakMap 实现私有属性的主要缺点是需要额外的内存空间,而且代码相对繁琐。在 ES9 中,使用井号(#)定义私有属性更加简单清晰,也可以避免一些可能出现的问题,推荐使用。
结论
在 ES9 中,我们可以使用井号(#)来定义私有属性。私有属性只能在类的内部访问,外部访问会报错。使用私有属性可以更加精细地控制类的状态,避免意外修改。我们还可以使用闭包和 WeakMap 在 ES9 之前实现类似的功能,不过相对更加繁琐。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/66ff8c741b0bf82c71cbbfdb