【javascript】class的继承之super的使用
我们大家都知道,在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用在普通方法中
- super指向父类的原型对象
- 通过super调用父类方法时,super内部的this指向子类的实例
- 当通过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用在静态方法中
- super指向父类(不是父类的原型对象)
- 在子类的静态方法中通过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的使用相关推荐
- JavaScript中es5继承(call、apply)和es6继承(super)
欢迎加入qq群(IT-程序猿-技术交流群):757345416 今天我们来研究下JavaScript中的继承: es5: //构造器函数 function Person(name,age,sex){t ...
- JavaScript中的继承入门
正统的面相对象的语言都会提供extend之类的方法用于出来类的继承,但Javascript并不提供extend方法,在Javascript中使用继承需要用点技巧. Javascript中的实例的属性和 ...
- JavaScript之各种继承方式和优缺点
2019独角兽企业重金招聘Python工程师标准>>> JavaScript之各种继承方式和优缺点 原型链继承 function Parson(){this.name = 'hy' ...
- Java:继承之super关键字,继承之私有权限,继承之方法重写,继承之object类,继承之简单工厂模式
一.继承的概念及用法 继承背后的思想就是 基于已存在的类来构建新类 当从已存在类继承时,就重用了它的方法和属性,还可以添加新的方法和属性来定制新类以应对需求 ...
- (JAVA学习笔记) 类的继承,super,方法的重写,多态
文章目录 类的继承,super,方法的重写,多态 1.类的继承 代码演示: 2.super和this 代码演示: 3.方法的重写 代码演示: 4.多态 代码演示: 类的继承,super,方法的重写,多 ...
- JavaScript学习13 JavaScript中的继承
JavaScript学习13 JavaScript中的继承 继承第一种方式:对象冒充 <script type="text/javascript">//继承第一种方式: ...
- Javascript 原型和继承(Prototypes and Inheritance)
Javascript 原型和继承(Prototypes and Inheritance) 收藏 前面我们看到了如何使用 constructor 来初始化对象.如果这样做,那么每一个创建的新对象都会对 ...
- javascript中的继承方式
javascript中的继承方式有好几种. 下面分别举例供大家参考学习: 1.function parent() { this.x=1; } function child() { var instan ...
- JavaScript大杂烩4 - 理解JavaScript对象的继承机制
JavaScript是单根的完全面向对象的语言 JavaScript是单根的面向对象语言,它只有单一的根Object,所有的其他对象都是直接或者间接的从Object对象继承.而在JavaScript的 ...
- python super().__init__()_python——多继承使用super().__init__ 发生的状态
print("******多继承使用super().__init__ 发生的状态******") class Parent(object): def __init__(self, ...
最新文章
- 首次使用批处理框架 Spring Batch ,被震撼到了,太强大...
- 安卓三维展示源码_手机(安卓)自动化脚本开发线上培训
- 使用Docker容器的十大误区
- [Android] 输入系统(三):加载按键映射
- 黄聪:电子商务关键数字优化(线上部分,上)
- 操作系统知识点大总结
- VC编译选项 /EHa 异常处理
- 卸载MySQL安装包
- 51单片机入门——数码管
- 柴静自费百万调查雾霾真相
- 电力监控系统的研究与应用
- 《计算机网络 PDF》炸了!!!
- 通达信 移动平均算法_【股市钱包】A005号指标:通达信分时图MACD
- 4g 控矿驱动 迪兰rx574_用结果说话 篇四:迪兰RX580 2048SP 4G X-Serial战将i7-8700与R5 2400G双平台体验点评...
- 网站安全渗透测试团队公司解决防护方案
- 碎片时间”绑架了多少焦虑的现代人?
- FPGA逻辑设计回顾(2)那些年学习FPGA较为常见的疑问?
- android一键添加QQ群,关注微信公众号
- 对于工作学习的一些感想
- NR/5G - PUSCH repetition次数