栈是一种遵从后进先出(LIFO)原则的有序集合。新添加的或待删除的元素都保存在栈的同一端,称作栈顶,另一端就叫栈底。在栈里,新元素都靠近栈顶,旧元素都接近栈底。
function Stack() {
let items = [];
//向栈添加元素
this.push = function(element) {
items.push(element);
}
//从栈里移除元素
this.pop = function() {
return items.pop();
}
//查看栈顶元素
this.peek = function() {
return items[items.length-1];
}
//检查栈是否为空
this.isEmpty = function() {
return items.length == 0;
}
//查看栈的长度
this.size = function() {
return items.length;
}
//清空和打印栈元素
this.clear = function() {
items = [];
}
this.print = function() {
console.log(items.toString());
}
}
用ES6语法声明Stack类
class Stack {
constructor() {
this.items = [];
}
push(element) {
this.items.push(element);
}
...//其他方法
}
用ES6的WeakMap实现类
有一种数据类型可以确保属性是私有的,这就是WeakMap。WeakMap可以存储键值对,其中键是对象,值可以是任意数据类型。
如果用WeakMap来存储items变量,Stack类就是这样的:
const items = new WeakMap();
class Stack {
constructor() {
items.set(this, []);
}
push(element) {
let s = item.get(this);
s.push(element);
}
pop() {
let s = items.get(this);
let r = s.pop();
return r;
}
//其他方法
}
现在我们知道,items在Stack类里是真正的私有属性了。但items现在仍然是在Stack类以外声明的,因此谁都可以改动他。我们要用一个闭包(外层函数)把Stack类包起来,这样就只能在这个函数里访问WeakMap:
let Stack = ({
...
//其他方法
return Stack;
})();