自定义一个 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
})();
做到以上两点便可实现类属性安全。