- 28
- 0
- 是在某本书上看到的,然后产生了疑惑,代码如下:
- ES5的function定义类
// 定义一个栈
function Stack() {
let items = [];
this.push = function push(element) {
items.push(element);
};
this.pop = function pop() {
return items.pop();
};
// 以下为其他栈方法
}
- ES6的class定义类
//定义一个栈
class Stack {
constructor() {
this.items = [];
}
push(element) {
this.items.push(element);
}
pop() {
return this.items.pop();
}
// 以下为其他栈方法
}
书上是这么解释的:
- ES5
在ES5中我们声明了一个私有的items变量,它只能被Stack函数或类访问。然而,这个方法为每
个类的实例都创建一个items变量的副本。因此,如果要创建多个Stack实例,它就不太适合了。
- ES6
变量items却是公共的。ES6的类是基于原型的。虽然基于原型的类比基于函数的类更节省内存,也更适合创建多个实例,却不能够声明私有属性(变量)或方法。
问题
- ES5说为每一个实例都创建了一个items变量副本,为何就说不适合创建多个Stack实例?
- 但ES6用构造函数定义一个items,不也是相当于给每一个实例都创建了一个items变量吗??为何这就适合创建多个实例了?这跟ES5的那个items变量副本的优势在哪呢?
(基于原型的类比基于函数的类更节省内存,也更适合创建多个实例,这句话倒是明白的。)
- 共 0 条
- 全部回答
-
长得乖ぃ该我歪 普通会员 1楼
在ES6中,我们可以通过class关键字来定义类,而不是直接使用function关键字。这主要有以下几个原因:
-
语法更简洁:类的语法更加简洁,比function关键字更容易理解和使用。
-
声明变量:在类中声明变量,比在函数中声明变量更加方便。
-
类的继承:在类中,可以使用继承机制,这使得代码更加模块化和可重用。
-
类的解构赋值:在类中,可以使用解构赋值语法,这使得代码更加简洁和易于理解。
以下是一个简单的类的例子:
javascript class Person { constructor(name, age) { this.name = name; this.age = age; } }在这个例子中,我们定义了一个Person类,它有name和age两个属性,以及一个构造函数。你可以这样使用这个类:
javascript const person = new Person('Tom', 20); console.log(person.name); // 输出 'Tom' console.log(person.age); // 输出 20总的来说,虽然函数可以用来创建类,但是使用class关键字定义类更加简洁和易于理解。
-
- 扫一扫访问手机版
回答动态

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器更新之后。服务器里面有部分玩家要重新创建角色是怎么回事啊?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题函数计算不同地域的是不能用内网吧?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题ARMS可以创建多个应用嘛?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题在ARMS如何申请加入公测呀?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题前端小程序接入这个arms具体是如何接入监控的,这个init方法在哪里进行添加?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器刚到期,是不是就不能再导出存档了呢?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器的游戏版本不兼容 尝试更新怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器服务器升级以后 就链接不上了,怎么办?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器转移以后服务器进不去了,怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器修改参数后游戏进入不了,是什么情况?预计能赚取 0积分收益
- 回到顶部
- 回到顶部

