返回

ES6 下实现类的私有变量的多种实现方案

前端

前言

在面向对象编程中,私有变量是类的内部状态,仅供类本身使用,其他对象无法直接访问。在 ES6 之前,JavaScript 中没有原生支持私有变量,因此需要通过各种技巧来模拟私有变量的行为。ES6 中引入了 class 语法,为类提供了更好的支持,也为实现私有变量提供了更简洁、更优雅的方式。

使用闭包实现私有变量

闭包是一种函数嵌套的技巧,它允许内部函数访问外部函数的变量,即使外部函数已经返回。利用闭包,我们可以将私有变量存储在外部函数中,而内部函数则可以访问并修改这些私有变量。

// 创建一个类
class MyClass {
  // 使用闭包来实现私有变量
  constructor() {
    const privateVariable = 10;

    // 内部函数,可以访问私有变量
    const getPrivateVariable = () => {
      return privateVariable;
    };

    // 返回内部函数,以便类可以访问私有变量
    return getPrivateVariable;
  }
}

// 创建类的实例
const instance = new MyClass();

// 通过实例访问私有变量
const privateVariableValue = instance();

console.log(privateVariableValue); // 输出:10

这种方法的优点是简单易懂,而且不需要使用任何特殊的语法。缺点是,如果类有很多私有变量,那么就会有很多闭包函数,这可能会导致代码难以阅读和维护。

使用构造函数实现私有变量

在 ES6 中,类的构造函数可以在创建实例时执行一些初始化操作。我们可以利用构造函数来为私有变量赋值,这样私有变量就只能在类的内部访问。

// 创建一个类
class MyClass {
  // 使用构造函数来实现私有变量
  constructor() {
    this._privateVariable = 10;
  }

  // 公共方法,可以访问私有变量
  getPrivateVariable() {
    return this._privateVariable;
  }
}

// 创建类的实例
const instance = new MyClass();

// 通过实例访问私有变量
const privateVariableValue = instance.getPrivateVariable();

console.log(privateVariableValue); // 输出:10

这种方法的优点是简单易懂,而且不需要使用任何特殊的语法。缺点是,私有变量必须在构造函数中初始化,如果在类的其他方法中使用私有变量,那么就必须先在构造函数中初始化这些私有变量。

使用 Symbol 实现私有变量

Symbol 是 ES6 中引入的一种新的原始数据类型,它可以表示一个唯一的标识符。我们可以利用 Symbol 来创建私有变量,这样私有变量就无法被其他对象访问。

// 创建一个 Symbol
const privateSymbol = Symbol('privateVariable');

// 创建一个类
class MyClass {
  // 使用 Symbol 来实现私有变量
  constructor() {
    this[privateSymbol] = 10;
  }

  // 公共方法,可以访问私有变量
  getPrivateVariable() {
    return this[privateSymbol];
  }
}

// 创建类的实例
const instance = new MyClass();

// 通过实例访问私有变量
const privateVariableValue = instance.getPrivateVariable();

console.log(privateVariableValue); // 输出:10

这种方法的优点是私有变量是真正私有的,其他对象无法通过任何方式访问这些私有变量。缺点是,Symbol 语法相对复杂,而且不支持在类的构造函数之外初始化私有变量。

比较三种实现方案

实现方案 优点 缺点
闭包 简单易懂,不需要特殊语法 如果类有很多私有变量,会产生很多闭包函数,导致代码难以阅读和维护
构造函数 简单易懂,不需要特殊语法 私有变量必须在构造函数中初始化,如果在类的其他方法中使用私有变量,必须先在构造函数中初始化
Symbol 私有变量真正私有,其他对象无法通过任何方式访问 Symbol 语法相对复杂,不支持在类的构造函数之外初始化私有变量

总结

ES6 中有三种实现类私有变量的方法:闭包、构造函数和 Symbol。每种方法都有自己的优缺点,开发者可以根据自己的需求选择最合适的方法。在大多数情况下,使用构造函数实现私有变量是最简单易懂的方法。如果需要真正私有的变量,则可以使用 Symbol 实现私有变量。