• JavaScript面向对象:类的继承


    继承

     

    现实中的继承:子承父业,比如我们都继承了父亲的姓。

    程序中的继承:子类可以继承父类的一些属性和方法。

    语法:

    1. class Father{ // 父类
    2. }
    3. class Son extends Father { // 子类继承父类
    4. }

    实例:

    1. class Father {
    2. constructor(surname) {
    3. this.surname= surname;
    4. }
    5. say() {
    6. console.log('你的姓是' + this.surname);
    7. }
    8. }
    9. class Son extends Father{ // 这样子类就继承了父类的属性和方法
    10. }
    11. var damao= new Son('刘');
    12. damao.say();

    super 关键字

    super 关键字用于访问和调用对象父类上的函数。可以调用父类的构造函数,也可以调用父类的普通函数

    这样会报错,因为父类的this指向的是父亲自己 

    语法:

    1. class Person { // 父类
    2. constructor(surname){
    3. this.surname = surname;
    4. }
    5. }
    6. class Student extends Person { // 子类继承父类
    7. constructor(surname,firstname){
    8. super(surname); // 调用父类的constructor(surname)
    9. this.firstname = firstname; // 定义子类独有的属性
    10. }
    11. }

     要先有super,才能使用this 

    注意: 子类构造函数使用super, 必须放到 this 前面  (必须先调用父类的构造方法,在使用子类构造方法)

     就近原则 输出的还是孩子

       继承中的属性或者方法查找原则: 就近原则

            1. 继承中,如果实例化子类输出一个方法,先看子类有没有这个方法,如果有就先执行子类的

            2. 继承中,如果子类里面没有,就去查找父类有没有这个方法,如果有,就执行父类的这个方法(就近原则)

     

     用super就可以调用父类的普通函数

     刚刚想到了为什么要用构造函数,就是如果不使用constructor(),就不知道this.x指向的是那个。使用了constructor,把里面的x传给了this.x,这样就可以使用里面的方法

      案例:

    1. class Father {
    2. constructor(surname) {
    3. this.surname = surname;
    4. }
    5. saySurname() {
    6. console.log('我的姓是' + this.surname);
    7. }
    8. }
    9. class Son extends Father { // 这样子类就继承了父类的属性和方法
    10. constructor(surname, fristname) {
    11. super(surname); // 调用父类的constructor(surname)
    12. this.fristname = fristname;
    13. }
    14. sayFristname() {
    15. console.log("我的名字是:" + this.fristname);
    16. }
    17. }
    18. var damao = new Son('刘', "德华");
    19. damao.saySurname();
    20. damao.sayFristname();

    super关键字 用于访问和调用对象父类上的函数。可以调用父类的构造函数,也可以调用父类的普通函数

    语法

    1. class Father {
    2. say() {
    3. return '我是爸爸';
    4. }
    5. }
    6. class Son extends Father { // 这样子类就继承了父类的属性和方法
    7. say() {
    8. // super.say() super 调用父类的方法
    9. return super.say() + '的儿子';
    10. }
    11. }
    12. var damao = new Son();
    13. console.log(damao.say());

    三个注意点:

    1. ES6 类没有变量提升,所以必须先定义类,才能通过类实例化对象.

    2.类里面的共有属性和方法一定要加this使用.

    3.里面的this指向问题.

    4.constructor 里面的this指向实例对象, 方法里面的this 指向这个方法的调用者

  • 相关阅读:
    任意文件下载漏洞(CVE-2021-44983)
    8年测试经验,简单易懂的讲解一下什么是自动化测试?
    windows 中pycharm中venv无法激活
    nginx+rtmp+yamdi镜像制作
    云服务器的安全设置常识
    Nginx 文件名逻辑漏洞(CVE-2013-4547)
    quickapp_快应用
    头歌php mysql操作答案
    八股文-持续更新......
    CDH集成的kerberos迁移实战
  • 原文地址:https://blog.csdn.net/weixin_64612659/article/details/127830874