Skip to content

关于自定义类中的变量安全

Posted on:September 13, 2020

自定义一个 Stack 类来模拟“栈”这种数据结构

let Stack = (function () {
  let _arr = Symbol("arr"); // 声明定义了一个arr变量,类型是Symbol(),类型描述内容是arr
  class Stack {
    constructor() {
      this[_arr] = []; // 在当前类上私有化了一个_arr属性并赋值为空数组
    }
    push(item) {
      this[_arr].push(item);
    }
    pop() {
      return this[_arr].pop();
    }
    isEmpty() {
      return this[_arr].length === 0;
    }
    clear() {
      this[_arr] = [];
    }
    top() {
      return this[_arr][this.size() - 1];
    }
    size() {
      return this[_arr].length;
    }
    get() {
      return this[_arr];
    }
  }
  return Stack;
})();

const stack = new Stack();
stack.push(1);
stack.push(2);
stack.push(3);
console.log(stack.get());

变量安全

通常我们自定义一个 JavaScript 类时,会有一个构造函数 constructor,并在该构造函数类初始化一些变量或方法

  class Person(){
    constructor(){
      this.name = "Red"
    }
    //some methods...
  }

  const person = new Person();
  person.name = "John"

但是这样存在一个问题:当我们 new 这个类并得到一个对象 person,是可以直接通过 person.name 修改类变量的,这就会导致外部修改内部属性,造成类属性混乱和变量不安全。

根据类变量对外部不可见原则,可通过 Symbol 数据类型定义一个唯一的私有变量

另外,再通过闭包实现变量的局部可访问性,即:

let fun = (function () {
  //closer
})();

做到以上两点便可实现类属性安全。