返回

ES6 系列之私有变量的实现

前端

约定

ES6 中没有提供直接的私有变量语法,但我们可以通过一些约定来实现私有变量。

  1. 使用下划线前缀:

    这种方法是最简单直接的,也是最常见的。我们可以使用下划线前缀来表示私有变量,例如:

    class Person {
      constructor(name) {
        this._name = name;
      }
    
      getName() {
        return this._name;
      }
    }
    

    这种方法的优点是简单易懂,缺点是私有变量很容易被外部访问,因为只要知道变量名,就可以直接访问它。

  2. 使用 Symbol:

    Symbol 是 ES6 中的新增特性,它可以创建唯一的标识符。我们可以使用 Symbol 来创建私有变量,例如:

    const _name = Symbol();
    
    class Person {
      constructor(name) {
        this[_name] = name;
      }
    
      getName() {
        return this[_name];
      }
    }
    

    这种方法的优点是私有变量不容易被外部访问,因为 Symbol 创建的标识符是唯一的,除非知道标识符的名称,否则无法访问私有变量。缺点是这种方法的实现比较复杂,而且 Symbol 是 ES6 中的新增特性,可能不支持旧的浏览器。

闭包

闭包是指内部函数可以访问外部函数的变量的函数。我们可以利用闭包来实现私有变量,例如:

function Person(name) {
  var _name = name;

  this.getName = function() {
    return _name;
  };
}

这种方法的优点是简单易懂,缺点是私有变量只能在内部函数中访问,如果我们需要在外部访问私有变量,就需要通过 getter 和 setter 方法。

constructor 的逻辑变得复杂。

构造函数应该只做对象初始化的事情,现在为了实现私有变量,必须包含部分方法的实现,代码组织上略不清晰。

Symb…

Symbol 是 ES6 中的新增特性,它可以创建唯一的标识符。我们可以使用 Symbol 来创建私有变量,例如:

const _name = Symbol();

class Person {
  constructor(name) {
    this[_name] = name;
  }

  getName() {
    return this[_name];
  }
}

这种方法的优点是私有变量不容易被外部访问,因为 Symbol 创建的标识符是唯一的,除非知道标识符的名称,否则无法访问私有变量。缺点是这种方法的实现比较复杂,而且 Symbol 是 ES6 中的新增特性,可能不支持旧的浏览器。