微信登录

对象 - 类与继承 - 类的私有属性与方法

前端 - Javascript 《对象 - 类与继承 - 类的私有属性与方法》

在 JavaScript 的世界里,类是构建对象的蓝图,而类的私有属性与方法则像是类这个小王国里的“机密文件”,只能在特定的范围内被访问和使用。今天,我们就一起来揭开类的私有属性与方法的神秘面纱。

为什么需要私有属性与方法?

在实际开发中,我们常常希望某些属性和方法只能在类的内部被访问和修改,而不暴露给外部。这样可以增强代码的安全性和封装性,避免外部代码意外修改类的内部状态,导致程序出现难以调试的问题。就好比你有一个存钱罐,你不希望别人随意打开拿走里面的钱,只允许自己在需要的时候进行操作。

实现私有属性与方法的方式

传统方式:使用闭包

在 ES6 之前,我们可以使用闭包来模拟私有属性和方法。示例代码如下:

  1. function Person() {
  2. // 私有属性
  3. let privateName = 'John';
  4. // 私有方法
  5. function privateGreet() {
  6. return `Hello, I'm ${privateName}`;
  7. }
  8. // 公有方法,用于访问私有属性和方法
  9. this.publicGreet = function() {
  10. return privateGreet();
  11. };
  12. }
  13. let person = new Person();
  14. console.log(person.publicGreet()); // 输出: Hello, I'm John
  15. console.log(person.privateName); // 输出: undefined
  16. console.log(person.privateGreet); // 输出: undefined

在这个例子中,privateNameprivateGreet 都是私有成员,外部无法直接访问,只能通过公有方法 publicGreet 来间接访问。

ES6+ 方式:使用 # 语法

ES6 引入了类的概念,而在 ES2022 中,正式支持了使用 # 语法来定义私有属性和方法。示例代码如下:

  1. class Animal {
  2. // 私有属性
  3. #name;
  4. constructor(name) {
  5. this.#name = name;
  6. }
  7. // 私有方法
  8. #makeSound() {
  9. return 'Roar!';
  10. }
  11. // 公有方法,用于访问私有属性和方法
  12. publicInfo() {
  13. return `${this.#name} says ${this.#makeSound()}`;
  14. }
  15. }
  16. let animal = new Animal('Lion');
  17. console.log(animal.publicInfo()); // 输出: Lion says Roar!
  18. console.log(animal.#name); // 报错,私有属性无法直接访问
  19. console.log(animal.#makeSound); // 报错,私有方法无法直接访问

使用 # 语法定义的私有成员,外部代码无法直接访问,只能在类的内部使用。

总结

实现方式 优点 缺点
闭包 兼容性好,ES6 之前就可以使用 语法相对复杂,每个实例都会创建一份闭包,占用更多内存
# 语法 语法简洁,是 ES2022 官方支持的方式,性能更好 兼容性较差,需要较新的浏览器或 Node.js 版本支持

类的私有属性与方法就像是 JavaScript 类的“守护神”,它们帮助我们更好地管理和保护类的内部状态,提高代码的安全性和可维护性。无论是使用闭包还是 # 语法,都能实现类的封装性,让我们的代码更加健壮和可靠。在实际开发中,我们可以根据项目的需求和兼容性要求来选择合适的实现方式。

对象 - 类与继承 - 类的私有属性与方法