在 ES8 中,新增了一个非常神奇的特性,那就是私有属性和方法。私有属性和方法可以保证对象的内部状态不被外部直接访问或者修改,从而增强了对象的封闭性和安全性。本文将详细讲解 ES8 中的私有属性和方法的用法和注意事项。
什么是 Private Fields 和方法
私有属性和方法是指,只能在类的内部才能使用的属性和方法。这些属性和方法外部无法访问和修改。在 ES8 中,可以使用以下语法来定义私有属性和方法:
class MyClass { #privateField = 42; #privateMethod() { console.log('This is a private method'); } }
上面的代码中,使用 #
符号来定义私有属性和方法。可以看到,私有属性和方法定义在类的内部,并且只能在类的内部使用。
如何访问 Private Fields 和方法
虽然说,私有属性和方法定义在类的内部且外部无法访问,但是我们还需要在类的外部使用这些私有属性和方法。那么如何做到呢?
ES8 中,使用 getter 和 setter 方法,可以让外部代码访问私有属性和方法,但是 getter 和 setter 方法也需要定义在类的内部。例如:
class MyClass { #privateField = 42; get secretNumber() { return this.#privateField; } set secretNumber(num) { this.#privateField = num; } #privateMethod() { console.log('This is a private method'); } publicMethod() { console.log('This is a public method'); this.#privateMethod(); } }
上面的代码中,我们定义了一个私有属性 #privateField
和一个私有方法 #privateMethod
。然后我们定义了一个 getter 方法 secretNumber
和一个 setter 方法 secretNumber
来访问私有属性。在公有方法 publicMethod
中,我们调用了私有方法。
注意事项
- 私有属性和方法只能在类的内部使用,无法在类的外部直接访问。
- 私有属性和方法不会被继承。如果想让子类访问父类的私有属性和方法,可以使用
super
关键字。 - 私有属性和方法的名字可以与公有属性和方法的名字相同,但是建议避免使用相同的名字,以避免混淆。
- 私有属性和方法可以与
static
关键字一起使用。例如:
class MyClass { static #privateField = 42; static #privateMethod() { console.log('This is a private static method'); } static publicMethod() { console.log('This is a public static method'); this.#privateMethod(); } } MyClass.publicMethod();
上面的代码中,我们定义了一个私有的静态属性 #privateField
和一个私有的静态方法 #privateMethod
。然后我们定义了一个公开的静态方法 publicMethod
。在 publicMethod
中,我们调用了私有的静态方法 #privateMethod
。
总结
私有属性和方法是 ES8 中非常有用的特性,可以帮助我们保护对象的内部状态,并增强对象的封闭性和安全性。在使用私有属性和方法时,需要注意其访问方式和命名规范,以避免出现混淆和不必要的错误。
示例代码:
class MyClass { #privateField = 42; get secretNumber() { return this.#privateField; } set secretNumber(num) { this.#privateField = num; } #privateMethod() { console.log('This is a private method'); } publicMethod() { console.log('This is a public method'); this.#privateMethod(); } } const myObject = new MyClass(); console.log(myObject.secretNumber); // 42 myObject.secretNumber = 100; console.log(myObject.secretNumber); // 100 myObject.publicMethod(); // "This is a public method" "This is a private method"
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/659e5217add4f0e0ff7511de