深入浅析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数组方法扩展实现数组统计函数
Apr 09 Javascript
Linux下使用jq友好的打印JSON技巧分享
Nov 18 Javascript
javascript中加var和不加var的区别 你真的懂吗
Jan 06 Javascript
基于jQuery实现点击最后一行实现行自增效果的表格
Jan 12 Javascript
jQuery 3.0十大新特性
Jul 06 Javascript
基于 Vue 的树形选择组件的示例代码
Aug 18 Javascript
JavaScript实现焦点进入文本框内关闭输入法的核心代码
Sep 20 Javascript
小程序实现带年月选取效果的日历
Jun 27 Javascript
解决Layui 表单提交数据为空的问题
Aug 15 Javascript
浅谈vue 单文件探索
Sep 05 Javascript
php结合js实现多条件组合查询
May 28 Javascript
vue实现select下拉显示隐藏功能
Sep 30 Javascript
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
Windows下安装Memcached的步骤说明
2010/04/25 PHP
慎用preg_replace危险的/e修饰符(一句话后门常用)
2013/06/19 PHP
PHP实现仿百度文库,豆丁在线文档效果(word,excel,ppt转flash)
2016/03/10 PHP
PHP生成随机数的方法总结
2018/03/01 PHP
Jquery判断IE6等浏览器的代码
2011/04/05 Javascript
jQuery实战之品牌展示列表效果
2011/04/10 Javascript
jquery 插件学习(六)
2012/08/06 Javascript
javascript实现简单的Map示例介绍
2013/12/23 Javascript
Node.js文件操作详解
2014/08/16 Javascript
jquery实现用户信息修改验证输入方法汇总
2015/07/18 Javascript
javascript断点调试心得分享
2016/04/23 Javascript
js添加千分位的实现代码(超简单)
2016/08/01 Javascript
JavaScript使用简单正则表达式的数据验证功能示例
2017/01/13 Javascript
JavaScript之浏览器对象_动力节点Java学院整理
2017/07/03 Javascript
实例讲解javascript实现异步图片上传方法
2017/12/05 Javascript
手淘flexible.js框架使用和源代码讲解小结
2018/10/15 Javascript
JavaScript中的null和undefined用法解析
2019/09/30 Javascript
JavaScript写个贪吃蛇小游戏(超详细)
2020/03/17 Javascript
[01:13:59]LGD vs Mineski Supermajor 胜者组 BO3 第三场 6.5
2018/06/06 DOTA
python3 读写文件换行符的方法
2018/04/09 Python
python中找出numpy array数组的最值及其索引方法
2018/04/17 Python
python使用scrapy发送post请求的坑
2018/09/04 Python
解决pycharm py文件运行后停止按钮变成了灰色的问题
2018/11/29 Python
python使用参数对嵌套字典进行取值的方法
2019/04/26 Python
Python3 pickle对象串行化代码实例解析
2020/03/23 Python
python3.6环境下安装freetype库和基本使用方法(推荐)
2020/05/10 Python
Python如何实现机器人聊天
2020/09/10 Python
会计学生自我鉴定
2014/02/06 职场文书
本科生求职信
2014/06/17 职场文书
秋冬农业生产标语
2014/10/09 职场文书
2014年学校团委工作总结
2014/12/20 职场文书
导游词之昭君岛
2020/01/17 职场文书
Nginx 根据URL带的参数转发的实现
2021/04/01 Servers
Pytorch数据读取之Dataset和DataLoader知识总结
2021/05/23 Python
css常用字体属性与背景属性介绍
2022/02/28 HTML / CSS
详解flex:1什么意思
2022/07/23 HTML / CSS