我们大家都知道,在class的继承中,子类如果想要继承父类且能生成子类实例,就必须要在constructor中调用super(),那么super在此处到底代表什么呢?除了这个用法,super还有别的用法吗?

接下来我们就来捋一捋super的用法吧~

首先,super既可以当函数使用,也可以当对象使用

这是很重要的,我们需要记住,当你需要引用super时,你要想清楚在此处super是函数还是对象,所以当你直接console.log(super)时会报错,因为你没有指定super是什么

1. super作为函数

super作为函数在子类的constructor中调用时,代表的是父类的构造函数。但是,虽然super代表的是父类的构造函数,但它内部的this指向的是当前子类的构造函数,见如下例子。


class A{constructor() {console.log(new.target.name)}
}
class B extends A{constructor() {super();//其内部的this指向的是子类B的构造函数}
}
new A()//A
new B()//B

并且要记住,super作为函数只能用在子类的构造函数中

2. super作为对象

super作为对象用在子类中,我们仍然需要加以区分super是用在子类的普通方法还是静态方法中

super用在普通方法中

  1. super指向父类的原型对象
  2. 通过super调用父类方法时,super内部的this指向子类的实例
  3. 当通过super为子类属性赋值时,super就是this

上面的三点每一点都很关键,会与在静态方法中的使用形成对比

=====》对于第一点,如下:

class C{constructor() {}
}C.cc=7;
C.prototype.cc=100;class D extends C{constructor() {super();console.log(super.cc + " and I am in D")//100}
}

=====》对于第二点,如下:(注意看注释呀!

class C{constructor() {this.x=11;}fun(){this.x=3;}print(){console.log(this.x)}
}class D extends C{constructor() {super();this.x=90;}f(){super.fun();this.x=5;super.print();//5  敲黑板!!!如果此处没有this.x=5 则返回的是3,如果没有3,返回的是90,没有90,返回11}
}

=====》对于第三点,如下:

class C{constructor() {}
}class D extends C{constructor() {super();}e(){super.e=20;//这里的super是thisconsole.log(super.e)//这里的super指向的是父类的原型对象 undefinedconsole.log(this.e)//20}
}

super用在静态方法中

  1. super指向父类(不是父类的原型对象)
  2. 在子类的静态方法中通过super调用父类方法时,super内部的this指向子类(不是子类的实例)

=====》对于第一点,如下:

class E{constructor() {}static fun(){console.log("我是父类的fun")}fun(){console.log("我是父类原型对象的fun")}
}class F extends E{constructor() {super();}static son(){super.fun();//此时指向的是父类的fun  即静态fun}son(){super.fun();//此时指向的是父类的原型对象  即普通fun}
}
let ff=new F()
F.son()//我是父类的fun
ff.son()//我是父类原型对象的fun

=====>对于第二点,如下:(注意看注释呀!

class E{constructor() {this.x=2;}static print(){console.log(this.x)}
}class F extends E{constructor() {super();this.x=4;}static p(){this.x=8;  如果此处没有this.x=8,则F.p()的执行会是11如果F.x=11也没有,则输出undefined,不会输出构造函数中的2super.print();}
}
let ff=new F()
F.x=11
F.p()      

在上面两个关于x值的例子中,在普通方法中调用super时,若在子类和父类的方法中都未指定x的值,构造函数中的x值会被访问到;但是在静态方法中并不会,它会返回undefined,因为构造函数是类的实例。

最后总总结一下~

super作为函数使用,代表父类的构造函数,只能用在子类的构造函数中;

super作为对象使用,在普通方法之中指向父类的原型对象,在静态方法之中指向父类;在普通方法中调用父类方法,super内部的this指向子类的实例,在静态方法中指向子类。

实践是最好的证明哦,大家可以比对上面的代码,自己去探索super的用法呀~

【javascript】class的继承之super的使用相关推荐

  1. JavaScript中es5继承(call、apply)和es6继承(super)

    欢迎加入qq群(IT-程序猿-技术交流群):757345416 今天我们来研究下JavaScript中的继承: es5: //构造器函数 function Person(name,age,sex){t ...

  2. JavaScript中的继承入门

    正统的面相对象的语言都会提供extend之类的方法用于出来类的继承,但Javascript并不提供extend方法,在Javascript中使用继承需要用点技巧. Javascript中的实例的属性和 ...

  3. JavaScript之各种继承方式和优缺点

    2019独角兽企业重金招聘Python工程师标准>>> JavaScript之各种继承方式和优缺点 原型链继承 function Parson(){this.name = 'hy' ...

  4. Java:继承之super关键字,继承之私有权限,继承之方法重写,继承之object类,继承之简单工厂模式

    一.继承的概念及用法       继承背后的思想就是        基于已存在的类来构建新类         当从已存在类继承时,就重用了它的方法和属性,还可以添加新的方法和属性来定制新类以应对需求 ...

  5. (JAVA学习笔记) 类的继承,super,方法的重写,多态

    文章目录 类的继承,super,方法的重写,多态 1.类的继承 代码演示: 2.super和this 代码演示: 3.方法的重写 代码演示: 4.多态 代码演示: 类的继承,super,方法的重写,多 ...

  6. JavaScript学习13 JavaScript中的继承

    JavaScript学习13 JavaScript中的继承 继承第一种方式:对象冒充 <script type="text/javascript">//继承第一种方式: ...

  7. Javascript 原型和继承(Prototypes and Inheritance)

    Javascript 原型和继承(Prototypes and Inheritance) 收藏  前面我们看到了如何使用 constructor 来初始化对象.如果这样做,那么每一个创建的新对象都会对 ...

  8. javascript中的继承方式

    javascript中的继承方式有好几种. 下面分别举例供大家参考学习: 1.function parent() { this.x=1; } function child() { var instan ...

  9. JavaScript大杂烩4 - 理解JavaScript对象的继承机制

    JavaScript是单根的完全面向对象的语言 JavaScript是单根的面向对象语言,它只有单一的根Object,所有的其他对象都是直接或者间接的从Object对象继承.而在JavaScript的 ...

  10. python super().__init__()_python——多继承使用super().__init__ 发生的状态

    print("******多继承使用super().__init__ 发生的状态******") class Parent(object): def __init__(self, ...

最新文章

  1. 首次使用批处理框架 Spring Batch ,被震撼到了,太强大...
  2. 安卓三维展示源码_手机(安卓)自动化脚本开发线上培训
  3. 使用Docker容器的十大误区
  4. [Android] 输入系统(三):加载按键映射
  5. 黄聪:电子商务关键数字优化(线上部分,上)
  6. 操作系统知识点大总结
  7. VC编译选项 /EHa 异常处理
  8. 卸载MySQL安装包
  9. 51单片机入门——数码管
  10. 柴静自费百万调查雾霾真相
  11. 电力监控系统的研究与应用
  12. 《计算机网络 PDF》炸了!!!
  13. 通达信 移动平均算法_【股市钱包】A005号指标:通达信分时图MACD
  14. 4g 控矿驱动 迪兰rx574_用结果说话 篇四:迪兰RX580 2048SP 4G X-Serial战将i7-8700与R5 2400G双平台体验点评...
  15. 网站安全渗透测试团队公司解决防护方案
  16. 碎片时间”绑架了多少焦虑的现代人?
  17. FPGA逻辑设计回顾(2)那些年学习FPGA较为常见的疑问?
  18. android一键添加QQ群,关注微信公众号
  19. 对于工作学习的一些感想
  20. NR/5G - PUSCH repetition次数

热门文章

  1. 芯片ECO的种类和修复方法介绍
  2. 码云(Gitee)团队如何使用码云完成开发?
  3. 21个有用的python工具
  4. 项目:机器学习+FLD分类+python图像处理mnist数据集
  5. 2021-7-9 学习记录:前端动画制作钟表
  6. JMeter元件详解之逻辑控制器
  7. pyQt5 学习笔记(18)QLineEdit 单行文本输入
  8. React-Native 创建App项目
  9. html5制作坦克大战
  10. GPS接收机(二)圆极化天线仿真—场路协同仿真和相位中心计算