在 ECMAScript 2019 标准中,新增了 private 访问修饰符,使得开发者可以更好地封装类的成员,避免外部代码直接访问,从而提高代码的安全性和稳定性。本文将详细介绍 private 访问修饰符的使用,以及其在实际开发中的应用。
private 访问修饰符的定义
private 访问修饰符是指,类成员只能在类内部被访问,而不能被类的实例或者子类访问。具体的,private 修饰符可以添加到类的属性名和方法名之前。
// javascriptcn.com 代码示例 class Example { #privateProperty; constructor() { this.#privateProperty = 123; } #privateMethod() { console.log("This is a private method."); } }
在上面的示例中,#privateProperty 和 #privateMethod 都是声明为 private 的,属性和方法名之前加上了 # 符号。
private 访问修饰符的使用
访问 private 属性和方法
在类内部,可以直接访问 private 属性和方法,但是在类的外部和子类中,是不能访问的。
// javascriptcn.com 代码示例 class Example { #privateProperty; constructor() { this.#privateProperty = 123; } #privateMethod() { console.log("This is a private method."); } publicMethod() { console.log(this.#privateProperty); this.#privateMethod(); } } const example = new Example(); example.publicMethod(); // 输出 123 和 "This is a private method." console.log(example.#privateProperty); // SyntaxError: Private field '#privateProperty' must be declared in an enclosing class console.log(example.#privateMethod()); // SyntaxError: Private field '#privateMethod' must be declared in an enclosing class
代码中,publicMethod() 是一个公共方法,可以在类内外被访问。在该方法中,直接访问了 Example 类的 private 属性和方法。但是,在类外部,使用 private 属性和方法时,会出现 SyntaxError 错误。
子类继承 private 属性和方法
子类继承了父类的 private 属性和方法,但是不能直接访问。如果需要在子类中使用父类的 private 属性和方法,可以通过公共方法进行访问。
// javascriptcn.com 代码示例 class Parent { #privateProperty; constructor() { this.#privateProperty = 123; } #privateMethod() { console.log("This is a private method."); } publicMethod() { console.log(this.#privateProperty); this.#privateMethod(); } } class Child extends Parent { constructor() { super(); } childMethod() { // console.log(this.#privateProperty); // SyntaxError: Private field '#privateProperty' must be declared in an enclosing class // this.#privateMethod(); // SyntaxError: Private field '#privateMethod' must be declared in an enclosing class this.publicMethod(); // 调用父类的公共方法 } }
子类 Child 继承了父类 Parent 的 private 属性和方法,但是不能直接访问。在 childMethod() 方法中,调用了父类的公共方法 publicMethod(),从而间接地访问了父类的 private 属性和方法。
private 访问修饰符的应用
通过 private 访问修饰符,开发者可以更好地封装类的成员,防止意外的修改和访问,从而提高代码的安全性和稳定性。在实际开发中,可以利用 private 访问修饰符,实现以下应用场景。
模块化编程
通过使用 private 访问修饰符,可以在模块中封装私有变量和方法,防止其被外部访问和修改。
// javascriptcn.com 代码示例 const module = (function() { let privateVariable = 123; function privateMethod() { console.log("This is a private method."); } class Example { constructor() { privateVariable = 456; // 可以在类内部修改私有变量 } publicMethod() { console.log(privateVariable); privateMethod(); } } return Example; })(); const example = new module(); example.publicMethod(); // 输出 456 和 "This is a private method." console.log(example.privateVariable); // undefined console.log(example.privateMethod()); // TypeError: example.privateMethod is not a function
在模块化编程中,可以利用私有变量和私有方法,实现封装。在上面的示例中,通过使用 privateVariable 和 privateMethod,将其封装在模块内部,避免了外部的访问和修改。
工厂模式
通过使用 private 访问修饰符,可以在工厂模式中封装私有变量和方法,防止其被外部访问和修改。
// javascriptcn.com 代码示例 function factory() { let privateVariable = 123; function privateMethod() { console.log("This is a private method."); } return { getPrivateVariable() { return privateVariable; }, setPrivateVariable(value) { privateVariable = value; }, publicMethod() { console.log(privateVariable); privateMethod(); } }; } const example = factory(); example.publicMethod(); // 输出 123 和 "This is a private method." console.log(example.privateVariable); // undefined console.log(example.privateMethod()); // TypeError: example.privateMethod is not a function example.setPrivateVariable(456); example.publicMethod(); // 输出 456 和 "This is a private method."
在工厂模式中,可以利用私有变量和私有方法,实现封装。在上面的示例中,通过使用 privateVariable 和 privateMethod,将其封装在工厂函数内部,避免了外部的访问和修改。
总结
在 ECMAScript 2019 标准中,新增了 private 访问修饰符,使得开发者可以更好地封装类的成员,避免外部代码直接访问,从而提高代码的安全性和稳定性。在实际开发中,可以通过 private 访问修饰符,实现模块化编程和工厂模式的封装。
希望本文的介绍可以帮助读者更好地理解 private 访问修饰符,并在实际开发中加以应用。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/652f04387d4982a6eb0233ab