JavaScript 一直被认为是一门弱类型语言,缺少了传统程序语言中的 OOP(面向对象编程)特性,这也导致了在编写大型应用程序时,往往需要考虑到对象的可变性问题,难以保证程序的安全性和数据的完整性。ECMAScript 2015(ES6)的发布引入了类的概念,这使得 JavaScript 更加符合 OOP 的语言风格,使得大量面向对象编程的应用能够更简便地在 JavaScript 中实现。
然而,ES6 中的 class 存在一些问题,最主要的是类中属性和方法的可见性问题,即在类中定义的属性和方法都是公共的,而不具有私有化的特性。ES2021(ES12)中,新增了 private 属性和方法的支持,使得 JavaScript 真正具有了 OOP 中的封装特性,解决了类中的可见性问题,本文将为你详细介绍 ES12 中 private 属性的使用。
定义私有属性
在 ES12 中,我们可以通过在属性名前面添加井号 # 来定义私有属性,这样一来,无论是继承还是实例化,都无法或只能有限地访问私有属性。下面是一个简单的例子:
-- -------------------- ---- ------- ----- ------ - ------ ----------------- - ---------- - ----- - --------- - ------ ----------- - - ----- ---- - --- ------------ ------ ---------------------------- -- ----- ---- ------------------------ -- -----------
在这个例子中,我们定义了一个 Person 类,其中包含一个私有属性 #name。在构造函数中,我们对 #name 进行了赋值,而在 getName 方法中,我们返回了这个私有属性的值。值得注意的是,当我们进行实例化并调用 getName 方法时,是可以得到正确的值的,而当我们试图直接访问 #name 属性时,却会抛出 SyntaxError,这是因为私有属性只能在类内部访问。
定义私有方法
ES12 中的 private 属性不仅限于属性,它也可以用于定义私有方法,与属性定义方式相同,只需在方法名前面添加井号 # 即可:
-- -------------------- ---- ------- ----- ------ - ------ ----------------- - ---------- - ----- - --------- - ------ ----------- - -------------- - ---------- - ----- - ---------------- - -------------------- - - ----- ---- - --- ------------ ------ ---------------------------- -- ----- ---- ------------------- ------ -- ----------- --------------------- ------ ---------------------------- -- ----- ----
在这个例子中,我们定义了一个私有方法 #setName,它用于对私有属性 #name 进行赋值。在 changeName 方法中,我们调用了 #setName 方法来改变实例 john 的私有属性 #name 的值。同样地,当我们试图直接调用 #setName 方法时,会抛出 SyntaxError,而调用 changeName 方法却是有效的。
可继承的私有属性和方法
除了私有属性和方法的定义,ES12 的 private 属性还支持继承,即在父类中定义的私有属性和方法可以被子类继承和使用。下面是一个继承私有属性和方法的例子:
-- -------------------- ---- ------- ----- ------ - ------ ----------------- - ---------- - ----- - --------- - ------ ----------- - ---------- - ------- - --- - - ----- -------- ------- ------ - -------- ----------------- ------- - ------------ ------------ - ------- - ----------- - ------ ------------- - --------- - ----------------- - - ----- ---- - --- -------------- ----- ------ ----------------- ------------------ -- -------- ---- ----- -------- ----- ------ ----- -----
在这个例子中,我们定义了一个 Person 类和一个 Employee 类,其中 Employee 是 Person 的子类。在 Person 类中,我们定义了一个私有方法 #setId,而在 Employee 类中,我们使用了 super.#setId 方法,这样就可以在 Employee 实例中继承到父类中的私有方法 #setId。
总结
我们了解了 ES12 中的 private 属性及其用法,私有化的特性使得 JavaScript 更加符合传统 OOP 的语言风格,在编写大型应用程序时,可以更加方便地保证程序的安全性和数据的完整性。当然,在实际应用中,开发者还需要综合考虑私有化和对外开放的需求,权衡二者之间的利弊,才能更好地运用这一特性。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64e6f2dff6b2d6eab32486df