- 棧是一種後進先出(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
}
}
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 的方法使得子類無法繼承私有屬性