ECMAScript 2021(ES2021)是 JavaScript 的最新版本,它引入了一些新功能,其中包括类中的私有属性和方法。在以前的版本中,JavaScript 中的类只能通过约定来实现私有属性和方法,而 ES2021 使得这个过程更加简单和规范化。
私有属性
私有属性是类中只能通过类内部访问的属性。在 ES2021 中,可以通过在属性名前加上井号(#)来定义私有属性。例如:
-- -------------------- ---- ------- ----- ------- - ------------------ - --- --- ------------------- - ------ ------------------------ - --- ---------------------- - ----------------------- - ---- - -
在这个例子中,#myPrivateProperty
是一个私有属性,它只能在类内部访问。get
和 set
方法可以用来读取和修改私有属性的值。
注意,私有属性的名称必须以井号(#)开头。这个符号告诉 JavaScript 引擎,这个属性是私有的,不能从类外部访问。
私有方法
私有方法是类中只能通过类内部调用的方法。在 ES2021 中,可以通过在方法名前加上井号(#)来定义私有方法。例如:
class MyClass { #myPrivateMethod() { console.log('This is a private method.'); } publicMethod() { this.#myPrivateMethod(); } }
在这个例子中,#myPrivateMethod()
是一个私有方法,它只能在类内部调用。publicMethod()
是一个公共方法,它可以从类外部调用,并且可以访问私有方法。
注意,私有方法的名称必须以井号(#)开头。这个符号告诉 JavaScript 引擎,这个方法是私有的,不能从类外部调用。
示例代码
下面是一个完整的示例代码,它演示了如何在 ES2021 中定义类的私有属性和方法:
-- -------------------- ---- ------- ----- ----------- - -------- - -- --------------- - ----- -------------------------------- - ------ ------ - --------------------- - --------------- - ------------- -- ------- ----- --- - -------------------------------------- ------------- -- ---- ---------------------- ----------- ----------- ---- ---------- - ---------------- - -- ------- - -------------- - ------------------------- --------- ------- - ------------- -- ------- ----- --- - -------------------------------------- ------------- -- ---- --------------------- ----------- ----------- ---- ---------- - ------------ - --------------------- -------------------- - - ----- ------- - --- -------------- ---------------------- --------------------- ---------------------- ---------------------
在这个例子中,BankAccount
类有两个私有属性:#balance
和 #transactionFee
。它还有一个私有方法 #calculateTransactionFee()
,用于计算交易费用。
公共方法 deposit()
、withdraw()
和 getBalance()
可以从类外部调用,并且可以访问私有属性和方法。
总结
ES2021 中的类中的私有属性和方法为 JavaScript 开发者提供了更多的工具,使得代码更加简洁和安全。私有属性和方法可以防止外部代码对类的内部状态进行直接访问和修改,从而保证了代码的健壮性和可维护性。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/66175604d10417a22272f509