3 回答

TA貢獻1864條經驗 獲得超6個贊
因為書上是錯的,應該是這樣
ES5
在ES5中我們聲明了一個私有的items變量,它只能被Stack函數或類訪問。然而,這個方法為每個類的實例都創(chuàng)建push和pop方法的副本。因此,如果要創(chuàng)建多個Stack實例,它就不太適合了。
ES6
push和pop方法卻是公共的。ES6的類是基于原型的。雖然基于原型的類比基于函數的類更節(jié)省內存,也更適合創(chuàng)建多個實例,卻不能夠聲明私有屬性(變量)或方法。
而不是“item變量的副本”,item
本來就是類成員,當然要創(chuàng)建item變量的副本
。
關鍵在于用函數實現(xiàn)的類(不改prototype
)的每個對象的方法雖然功能和實現(xiàn)都是完全一致的,但它們都是不同的對象,都各自占有一定的內存空間,也就是說,使用函數實現(xiàn)類的話
var stackA = new Stack();
var stackB = new Stack();
console.log(stackA.push == stackB.push); // false
而用原型的話,
var stackA = new Stack();
var stackB = new Stack();
console.log(stackA.push == stackB.push); // true

TA貢獻1775條經驗 獲得超11個贊
我實在想不明白白這根es5,es6有什么關系?
function Stack1() {
let items = [];
this.push = function push(element) {
items.push(element);
};
this.pop = function pop() {
return items.pop();
};
}
class Stack2 {
constructor() {
let items = [];
this.push = function push(element) {
items.push(element);
};
this.pop = function pop() {
return items.pop();
};
}
}
function Stack3() {
this.items = [];
}
Stack3.prototype.push = function push(element) {
this.items.push(element);
};
Stack3.prototype.pop = function pop() {
return this.items.pop();
};
class Stack4 {
constructor() {
this.items = [];
}
push(element) {
this.items.push(element);
}
pop() {
return this.items.pop();
}
}
添加回答
舉報