账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    ES6的class跟直接function定义类的问题
    28
    0
    1. 是在某本书上看到的,然后产生了疑惑,代码如下:
    • 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的类是基于原型的。虽然基于原型的类比基于函数的类更节省内存,也更适合创建多个实例,却不能够声明私有属性(变量)或方法。

    问题

    1. ES5说为每一个实例都创建了一个items变量副本,为何就说不适合创建多个Stack实例?
    2. 但ES6用构造函数定义一个items,不也是相当于给每一个实例都创建了一个items变量吗??为何这就适合创建多个实例了?这跟ES5的那个items变量副本的优势在哪呢?

    (基于原型的类比基于函数的类更节省内存,也更适合创建多个实例,这句话倒是明白的。)

    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 长得乖ぃ该我歪 普通会员 1楼

      在ES6中,我们可以通过class关键字来定义类,而不是直接使用function关键字。这主要有以下几个原因:

      1. 语法更简洁:类的语法更加简洁,比function关键字更容易理解和使用。

      2. 声明变量:在类中声明变量,比在函数中声明变量更加方便。

      3. 类的继承:在类中,可以使用继承机制,这使得代码更加模块化和可重用。

      4. 类的解构赋值:在类中,可以使用解构赋值语法,这使得代码更加简洁和易于理解。

      以下是一个简单的类的例子:

      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关键字定义类更加简洁和易于理解。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部