ES6 类是 JavaScript 中一种新的语法糖,使得创建对象和继承更加方便。然而,与传统的基于原型链的继承模式不同,ES6 类中的方法默认是公开的,即可被子类和外部访问。但有时候我们希望某些方法只能在类内部被调用,这就需要使用私有方法。本文将介绍如何在 ES6 类中实现私有方法的六种方式。
1. 使用 WeakMap
WeakMap 是 ES6 中新增的一种数据结构,它的键值对都是弱引用关系,当键不再被引用时,对应的键值对会被垃圾回收。我们可以使用 WeakMap 来存储私有方法,使其只能在类内部调用。
示例代码:
-- -------------------- ---- ------- ----- ------------- - --- ---------- ----- ------- - ------------- - ----------------------- -- -- -------------- -- - ------- ----------- - -------------- - ----- ------ - ------------------------ --------- - -
在上面的例子中,私有方法 privateMethod
被存储在了 WeakMap
中,并且只有在类的构造函数中才能定义。在公共方法 publicMethod
中,我们通过 privateMethod.get(this)
来获取私有方法并调用。
2. 使用 Symbol
Symbol 是 ES6 中引入的一种新类型,它可以作为对象属性名,并保证其唯一性。我们可以使用 Symbol 来代替方法名,使其不容易被外部访问到。
示例代码:
-- -------------------- ---- ------- ----- ------------- - ------------------------ ----- ------- - ------------- - ------------------- - -- -- -------------- -- - ------- ---------- - -------------- - ---------------------- - -
在上面的例子中,私有方法 privateMethod
被定义为一个 Symbol 类型的属性,并且只能在类内部通过该属性来调用。
3. 使用闭包
使用闭包也是一种实现私有方法的方式。我们可以在类的构造函数中定义私有方法,并将其赋值给该类的公共方法,这样就可以在类内部访问私有方法。
示例代码:
class MyClass { constructor() { const privateMethod = () => console.log('I am a private method!'); this.publicMethod = () => privateMethod(); } }
在上面的例子中,私有方法 privateMethod
被定义为一个常量,并且只能在构造函数中访问。在公共方法 publicMethod
中,我们将私有方法赋值给了该方法,并通过该方法来调用私有方法。
4. 将私有方法放在模块中
ES6 模块中的变量和函数默认是私有的,我们可以将私有方法放在一个模块中,然后在类中导入并使用。
示例代码:
-- -------------------- ---- ------- -- ------------------ ----- ------------- - -- -- -------------- -- - ------- ---------- ------ - ------------- -- -- ---------- ------ - ------------- - ---- ----------------------- ----- ------- - -------------- - ---------------- - -
在上面的例子中,私有方法 privateMethod
被定义在一个模块中,并通过 export
导出。在类中,我们通过 import
导入该方法,并在公共方法 publicMethod
中调用。
5. 使用命名约定
使用命名约定也是一种实现私有方法的方式。将私有方法命名为以下划线开头的形式,表示该方法是私有的,不应该被外部访问到。
示例代码:
class MyClass { _privateMethod() { console.log('I am a private method!'); } > 来源:[JavaScript中文网](https://www.javascriptcn.com/post/11050) ,转载请注明来源 [https://www.javascriptcn.com/post/11050](https://www.javascriptcn.com/post/11050)