3 回答
TA贡献1864条经验 获得超6个赞
因为书上是错的,应该是这样
ES5
在ES5中我们声明了一个私有的items变量,它只能被Stack函数或类访问。然而,这个方法为每个类的实例都创建push和pop方法的副本。因此,如果要创建多个Stack实例,它就不太适合了。
ES6
push和pop方法却是公共的。ES6的类是基于原型的。虽然基于原型的类比基于函数的类更节省内存,也更适合创建多个实例,却不能够声明私有属性(变量)或方法。
而不是“item变量的副本”,item
本来就是类成员,当然要创建item变量的副本
。
关键在于用函数实现的类(不改prototype
)的每个对象的方法虽然功能和实现都是完全一致的,但它们都是不同的对象,都各自占有一定的内存空间,也就是说,使用函数实现类的话
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();
}
}
添加回答
举报