深入浅析ES6 Class 中的 super 关键字


Posted in Javascript onOctober 20, 2017

以下只是个人的学习笔记:

super这个关键字,既可以当作函数使用,也可以当作对象使用。在这两种情况下,它的用法完全不同。

1、当作函数使用

class A {}
class B extends A {
 constructor() {
  super(); //ES6 要求,子类的构造函数必须执行一次super函数。
 }
}

注意,super虽然代表了父类A的构造函数,但是返回的是子类B的实例,即super内部的this指的是B,因此super()在这里相当于A.prototype.constructor.call(this)。

class A {
 constructor() {
  console.log(new.target.name); //new.target指向当前正在执行的函数
 }
}
class B extends A {
 constructor() {
  super();
 }
}
new A() // A
new B() // B

可以看到,在super()执行时,它指向的是子类B的构造函数,而不是父类A的构造函数。也就是说,super()内部的this指向的是B。

2、当作对象使用

在普通方法中,指向父类的原型对象;在静态方法中,指向父类。

class A {
 c() {
  return 2;
 }
}
class B extends A {
 constructor() {
  super();
  console.log(super.c()); // 2
 }
}
let b = new B();

上面代码中,子类B当中的super.c(),就是将super当作一个对象使用。这时,super在普通方法之中,指向A.prototype,所以super.c()就相当于A.prototype.c()。

通过super调用父类的方法时,super会绑定子类的this。

class A {
 constructor() {
  this.x = 1;
 }
 s() {
  console.log(this.x);
 }
}
class B extends A {
 constructor() {
  super();
  this.x = 2;
 }
 m() {
  super.s();
 }
}
let b = new B();
b.m() // 2

上面代码中,super.s()虽然调用的是A.prototype.s(),但是A.prototype.s()会绑定子类B的this,导致输出的是2,而不是1。也就是说,实际上执行的是super.s.call(this)。

由于绑定子类的this,所以如果通过super对某个属性赋值,这时super就是this,赋值的属性会变成子类实例的属性。

class A {
 constructor() {
  this.x = 1;
 }
}
class B extends A {
 constructor() {
  super();
  this.x = 2;
  super.x = 3;
  console.log(super.x); // undefined
  console.log(this.x); // 3
 }
}
let b = new B();

上面代码中,super.x赋值为3,这时等同于对this.x赋值为3。而当读取super.x的时候,读的是A.prototype.x,所以返回undefined。

注意,使用super的时候,必须显式指定是作为函数、还是作为对象使用,否则会报错。

class A {}
class B extends A {
 constructor() {
  super();
  console.log(super); // 报错
 }
}

上面代码中,console.log(super)当中的super,无法看出是作为函数使用,还是作为对象使用,所以 JavaScript 引擎解析代码的时候就会报错。这时,如果能清晰地表明super的数据类型,就不会报错。

最后,由于对象总是继承其他对象的,所以可以在任意一个对象中,使用super关键字。

总结

以上所述是小编给大家介绍的ES6 Class 中的 super 关键字,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
js中的string.format函数代码
Aug 11 Javascript
Js与下拉列表处理问题解决
Feb 13 Javascript
jQuery简单图表peity.js使用示例
May 02 Javascript
JSONObject使用方法详解
Dec 17 Javascript
JavaScript中数组的22种方法必学(推荐)
Jul 20 Javascript
JavaScript面试开发常用的知识点总结
Aug 08 Javascript
浅析JavaScript动画模拟拖拽原理
Dec 09 Javascript
详解Node项目部署到云服务器上
Jul 12 Javascript
js实现会跳动的日历效果(完整实例)
Oct 18 Javascript
Vue.js最佳实践(五招助你成为vuejs大师)
May 04 Javascript
vue-cli项目修改文件热重载失效的解决方法
Sep 19 Javascript
Vue如何循环提取对象数组中的值
Nov 18 Vue.js
vue做网页开场视频的实例代码
Oct 20 #Javascript
使用JS中的Replace()方法遇到的问题小结
Oct 20 #Javascript
使用ionic(选项卡栏tab) icon(图标) ionic上拉菜单(ActionSheet) 实现通讯录界面切换实例代码
Oct 20 #Javascript
2种简单的js倒计时方式
Oct 20 #Javascript
pm2 部署 node的三种方法示例
Oct 20 #Javascript
vue.js实例对象+组件树的详细介绍
Oct 20 #Javascript
dropload.js插件下拉刷新和上拉加载使用详解
Oct 20 #Javascript
You might like
PHP大文件切割上传功能实例分析
2019/07/01 PHP
php报错502badgateway解决方法
2019/10/11 PHP
基础的prototype.js常用函数及其用法
2007/03/10 Javascript
Javascript中的var_dump函数实现代码
2009/09/07 Javascript
对Web开发中前端框架与前端类库的一些思考
2015/03/27 Javascript
原生JS实现平滑回到顶部组件
2016/03/16 Javascript
微信小程序 数据封装,参数传值等经验分享
2017/01/09 Javascript
JavaScript中的this陷阱的最全收集并整理(没有之一)
2017/02/21 Javascript
WebSocket实现简单客服聊天系统
2017/05/12 Javascript
使用jquery+iframe做一个ajax上传效果(实例)
2017/08/24 jQuery
vue环境搭建简单教程
2017/11/07 Javascript
弱类型语言javascript中 a,b 的运算实例小结
2019/08/07 Javascript
解决小程序无法触发SESSION问题
2020/02/03 Javascript
[01:06:54]DOTA2-DPC中国联赛 正赛 RNG vs Dragon BO3 第一场 1月24日
2021/03/11 DOTA
[32:30]夜魇凡尔赛茶话会 第一期01:谁是卧底
2021/03/11 DOTA
Python 代码性能优化技巧分享
2012/08/07 Python
python中plot实现即时数据动态显示方法
2018/06/22 Python
对python GUI实现完美进度条的示例详解
2018/12/13 Python
Python可迭代对象操作示例
2019/05/07 Python
用scikit-learn和pandas学习线性回归的方法
2019/06/21 Python
Python机器学习算法库scikit-learn学习之决策树实现方法详解
2019/07/04 Python
python基于gevent实现并发下载器代码实例
2019/11/01 Python
wxPython实现带颜色的进度条
2019/11/19 Python
python2.7使用scapy发送syn实例
2020/05/05 Python
pycharm远程连接服务器并配置python interpreter的方法
2020/12/23 Python
澳大利亚波西米亚风连衣裙在线商店:Fortunate One
2019/04/01 全球购物
Pamela Love官网:纽约设计师Pamela Love的精美、时尚和穿孔珠宝
2020/10/19 全球购物
Nobody Denim官网:购买高级女士牛仔裤
2021/03/15 全球购物
会议主持词
2014/03/17 职场文书
共产党员岗位承诺书
2014/05/29 职场文书
卫生标语大全
2014/06/21 职场文书
2015年服务员个人工作总结
2015/05/27 职场文书
Python实现视频中添加音频工具详解
2021/12/06 Python
python DataFrame中stack()方法、unstack()方法和pivot()方法浅析
2022/04/06 Python
什么是css原子化,有什么用?
2022/04/24 HTML / CSS
移除Selenium中window.navigator.webdriver值
2022/06/10 Python