在 ECMAScript 2020 中,可以使用私有方法来创建仅在类内部可见的方法。这提供了一种更好的封装,使代码更易于维护和扩展。在本文中,我们将介绍私有方法的用途、如何定义和使用它们,以及一些避免常见问题的注意事项。
私有方法的作用
私有方法为类提供了一种安全的方式来隐藏和保护类的内部实现。通常情况下,私有方法用于执行一些与类的内部状态相关的操作,而不是对外部环境产生影响。这使得代码更清晰易懂,避免了不必要的代码冗杂。
举个例子,考虑以下基于类的计算器的实现:
-- -------------------- ---- ------- ----- ---------- - ------------- - ---------- - - - ------ - ---------- -- - - ----------- - ---------- -- - - ----------- - ---------- -- - - --------- - -- -- --- -- - ----- --- --------------- -- ------ - ---------- -- - - ------- - ---------- - - - -展开代码
在这个实现中,所有方法都是公共的,并且都可以从类的外部进行访问和调用。这在某些情况下可能会引起问题,因为这意味着我们不能保证 total
的正确性,例如:
const calculator = new Calculator() calculator.add(5) calculator.total = 0 // oops! we just reset the calculator without clearing it console.log(calculator.total) // prints 0, but should print 5
为了避免这种情况发生,我们可以将 total
声明为私有属性,然后创建一些私有方法来处理它,例如:
-- -------------------- ---- ------- ----- ---------- - ------ - - ------------------------- - -- ------- ------- --- --------- - ----- --- ------------------ ---- -- - -------- - - ------------------------- - ------------------------------ -- -------- --- -- - ----- --- --------------- -- ------ - - -------- - ----------- - - - ------ - ------------------------ ----------- -- - - ----------- - ------------------------ ----------- -- - - ----------- - ------------------------ ----------- -- - - --------- - ------------------------ ----------- -- - - ------- - ------------- - ---------- - ------ ----------- - -展开代码
在这个实现中,我们使用 #
符号来标记私有属性和方法。我们将 total
声明为私有属性,同时定义了一些私有方法来验证操作数和除数,并清除计算器的状态。这使得我们可以在不暴露内部实现的情况下更好地封装代码。
定义和使用私有方法
要定义私有方法,请在方法名称前面加上 #
符号,例如:
-- -------------------- ---- ------- ----- ------- - ---------------- - -- -- ---- ------- ----- - -------------- - -- ---- ------- ------ --------------------- - -展开代码
在私有方法内部,可以使用 this
关键字来访问类的私有属性和方法,就像在公共方法中一样。但是,私有方法不能从类的外部进行访问和调用,否则将引发 TypeError
。
要在类的内部调用私有方法,可以使用 this.#methodName()
的形式。
注意事项
使用私有方法时,需要遵守一些基本规则和注意事项:
- 私有方法只能在包含它们的类的内部进行访问和调用。试图从类的外部访问或调用私有方法将引发
TypeError
。 - 私有方法的名称必须以
#
符号开头,以将其与公共方法区分开来。名称不得包含空格或任何其他非法字符。 - 在私有方法内部,可以使用
this
关键字来访问类的私有属性和方法。但是,注意私有方法也不能访问类的static
属性或方法。 - 无法使用
super
关键字来访问父类的私有方法,因为私有方法无法从类的外部进行访问。
示例代码
以下是一个简单的示例,演示如何在类中定义和使用私有方法:
-- -------------------- ---- ------- ----- ------ - ----- ----------------- - ---------- - ---- - --------- - ------ ---------- - -------- - ------------------- -- ---- -- --------------- - ----------- - ------------- ----------------- -- ---- ------ - - ----- ---- - --- -------------- ---------------- -- ------ ------- -- ---- -- ---------- -- ---- ----- ---------- -- ------ --------- ------------- -- ------ ---------展开代码
在这个示例中,我们创建了一个 Person
类,其中包含一个私有属性 #name
和一个私有方法 #greet()
。 #greet()
方法仅在 introduce()
方法内部调用,并打印出介绍自己的消息。
请注意,尝试从类的外部访问 #name
或 #greet()
方法都会引发 TypeError
。这确保了 #name
和 #greet()
是仅在类内部可见的私有组件。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67badb60306f20b3a69f665e