栈是一种后进先出(LIFO)的有序集合函数创建栈function Stack() { // 各种属性和方法的声明 item = [];// 需要一种数据结构来保存栈里的元素 // 为栈声明一些方法 /** * 添加一个或者几个新元素到栈顶 * @param element / this.push = function (element) { item.push(element) }; /* * 移出栈顶的元素,同时返回被移出的元素 * @returns {} / this.pop = function () { return item.pop() }; /* * 返回栈顶的元素,不对栈做任何修改 * @returns {} / this.peek = function () { return item[item.length - 1] }; /* * 如果栈里没有任何元素就返回true,否则返回false * @returns {boolean} / this.isEmpty = function () { return item.length === 0 }; /* * 移出栈里的所有元素 / this.clear = function () { item = [] }; /* * 返回栈里的元素个数 * @returns {Array|number} / this.size = function () { return item.length }}ES6语法声明class Stack { constructor() { this.items = []; } push(element) { this.items.push(element) } // 其他方法}/* * 由于根据原型实现,无法创建私有属性 //* * 改进1 * 使用ES6新增类型Symbol,基本类型,通常不可改变 * * ES6中Object.getOwnPropertySymbol()方法能够获取到类里面声明的所有Symbol属性,通过这个可以操作其他数组方法 /let _items = Symbol();class Stack { constructor() { this[_items] = []; } // Stack方法 push(element) { this[_items].push(element) }}let demo = new Stack();let objSymbols = Object.getOwnPropertySymbols(demo);demo[objSymbols[0]].pop();// 可以访问未暴露的数组方法/* * 改进2 * 使用WeakMap实现类(ES6新的集合类型,存储键值对,避开对数组方法的直接访问) */let Stack = (function () {// 闭包使得外部无法访问WeekMap,达到私有目的,并且不会暴露其他未暴露的数组方法 const items = new WeakMap(); class InnerStack { constructor() { items.set(this, []) } push(element) { items.get(this).push(element) } pop() { return items.get(this).pop() } print() { return items.get(this).toString() } } return InnerStack})();// 改进2 的方法使得子类无法继承私有属性栈的应用:十进制转二进制