class 类的继承

1. ES6中的类可以实现继承,通过extends关键字来实现子类继承父类;
2. 在子类构造函数中调用super()方法可以访问到父类的属性和方法,并且需要在使用this之前调用super()。这是因为在ES6的类继承中,子类在构造函数中必须先初始化父类的属性和方法,然后才能使用this关键字引用它自己的属性和方法。
3. constructor方法用于初始化类的实例属性,在子类中也可以定义constructor方法来覆盖父类的constructor方法,但是需要在子类的构造函数中先调用super()方法以初始化父类的属性和方法。

希望这些补充能够帮助你更好地理解ES6中的类和继承机制。

定义 父类  Person

    // 定义父类

      class Person {
        constructor(name, age) {
          //  构造函数,作用是初始化对象
          this.name = name;
          this.age = age;
        }
        say() {
          console.log(`我是${this.name},我今年${this.age}岁了!`);
        }
      }
      const per = new Person("小帅", 26);
      per.say(); //输出:我是小帅,我今年26岁了!

定义 Person1 子类 继承 Person 父类 

    // 定义 Person1 子类 继承 Person 父类 并添加自己的属性与方法,同时修改父类属性

      class Person1 extends Person {
        constructor(name, age, sex) {
          super(name, age); // 调用父类的 constructor 方法
          this.sex = sex; // 添加新的属性
        }

        say() {
          // 重写从父类继承而来的方法
          console.log(`我是重写从父类继承而来的方法,我叫${this.name},今年${this.age}岁了!`);
        }

        getSex() {
          // 添加新的方法
          console.log(`我是${this.sex}生!`);
        }
      }
      // 创建 Person1 实例对象
      const per1 = new Person1("小美", 20, "女");

      // 修改继承的属性
      per1.name = "小黑子";
      per1.age = 18;

      // 调用继承自父类的方法
      per1.say(); // 输出:我是重写从父类继承而来的方法,我叫小黑子,今年18岁了!

      // 调用子类新增的方法
      per1.getSex();// 输出:我是女生!

多个子类需要继承同一个父类 

     // 多个子类需要继承同一个父类

      class Person2 extends Person {
        constructor(name, age, game) {
          super(name, age); // 调用父类的 constructor 方法
          this.game = game; // 添加新的属性
        }
        // 继承父类的方法
        say() {
          console.log(`我是${this.name},我今年${this.age}岁了!`);
        }
        // 添加新的方法
        getGame() {
          console.log(`我喜欢玩${this.game}游戏!`);
        }
      }
        // 创建 Person2 实例对象
        const per2 = new Person2("小明", 21, "王者荣耀");
        per2.say(); // 输出:我是小明,我今年21岁了!
        per2.getGame(); // 输出:我喜欢玩王者荣耀游戏!

完整代码

 

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>教会你es6 class用法</title>
  </head>
  <body>
    <script>
      // 定义父类

      class Person {
        constructor(name, age) {
          //  构造函数,作用是初始化对象
          this.name = name;
          this.age = age;
        }
        say() {
          console.log(`我是${this.name},我今年${this.age}岁了!`);
        }
      }
      const per = new Person("小帅", 26);
      per.say(); //输出:我是小帅,我今年26岁了!

      // 定义 Person1 子类 继承 Person 父类 并添加自己的属性与方法,同时修改父类属性

      class Person1 extends Person {
        constructor(name, age, sex) {
          super(name, age); // 调用父类的 constructor 方法
          this.sex = sex; // 添加新的属性
        }

        say() {
          // 重写从父类继承而来的方法
          console.log(`我是重写从父类继承而来的方法,我叫${this.name},今年${this.age}岁了!`);
        }

        getSex() {
          // 添加新的方法
          console.log(`我是${this.sex}生!`);
        }
      }

      // 创建 Person1 实例对象
      const per1 = new Person1("小美", 20, "女");

      // 修改继承的属性
      per1.name = "小黑子";
      per1.age = 18;

      // 调用继承自父类的方法
      per1.say(); // 输出:我是重写从父类继承而来的方法,我叫小黑子,今年18岁了!

      // 调用子类新增的方法
      per1.getSex(); // 输出:我是女生!

      // 多个子类需要继承同一个父类

      class Person2 extends Person {
        constructor(name, age, game) {
          super(name, age); // 调用父类的 constructor 方法
          this.game = game; // 添加新的属性
        }
        // 继承父类的方法
        say() {
          console.log(`我是${this.name},我今年${this.age}岁了!`);
        }
        // 添加新的方法
        getGame() {
          console.log(`我喜欢玩${this.game}游戏!`);
        }
      }
      // 创建 Person2 实例对象
      const per2 = new Person2("小明", 21, "王者荣耀");
      per2.say(); // 输出:我是小明,我今年21岁了!
      per2.getGame(); // 输出:我喜欢玩王者荣耀游戏!
    </script>
  </body>
</html>

一些问题:

  •  q: 既然继承了为什么子类还要new父类呢?比如 const per1 = new Person1("小美", 20, "女");,不是要继承父类的属性和方法吗?为什么子类还要new父类的name和age?
  •  a: 当子类继承父类时,它会自动获得父类的属性和方法。但是,在创建子类的实例时,我们需要调用父类的构造函数来初始化父类的属性。如果没有初始化父类的属性,它们会保持未定义状态,这可能会导致程序出错。

                      因此,当我们在Person1子类中定义了一个新的构造函数时,我们需要手动调用super方法,并传递name和age参数给父类的构造函数,以便在创建Person1实例时,父类的属性能够被正确初始化。这样我们就可以在子类中使用继承来的属性和方法,而不必再次定义它们。

  • q:  这种的意义在哪,反正都要写两遍,我直接再写一个不就行了,他的使用场景在哪?

  • a: 使用类继承的意义在于避免重复编写相似的代码,从而提高代码的可读性和可维护性。当我们需要创建一些具有共同特征的对象时,可以将它们定义为一个父类,并让子类继承这个父类。这样,子类就可以获得父类中定义的所有属性和方法,而且如果需要对这些属性和方法进行修改或扩展,只需要在子类中进行即可。

          此外,由于子类继承了父类中的属性和方法,因此可以更轻松地实现代码复用。如果没有继承机制,我们可能需要在多个地方复制和粘贴相同的代码,这会增加程序的复杂度和难度。比如少写了很多的this.name = name; this.age=age;之类;

          总之,使用类继承可以帮助我们更好地组织和管理代码,提高代码的效率和可读性。

  • 我想知道这些个代码继承了什么

  • 本次演示了类继承的用法。它定义了一个名为 "Person" 的父类,其中包含一个构造函数和一个方法 "say",以及两个子类 "Person1" 和 "Person2",它们都继承自 "Person"。"Person1" 类添加了一个新属性和一个新方法,重写了从 "Person" 继承的 "say" 方法,并修改了继承的属性。"Person2" 类添加了不同的新属性和新方法,但没有重写 "say" 方法。最后,创建了所有三个类的实例,并调用了它们的方法。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

彩色之外

你的打赏是我创作的氮气加速动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值