深入浅析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判断IE6/IE7/FF的代码[XMLHttpRequest]
Feb 16 Javascript
jQuery使用hide方法隐藏页面上指定元素的方法
Mar 30 Javascript
js如何实现点击标签文字,文字在文本框出现
Aug 05 Javascript
AngularJS教程之环境设置
Aug 16 Javascript
jQuery插件Echarts实现的渐变色柱状图
Mar 23 jQuery
基于JavaScript实现五子棋游戏
Aug 26 Javascript
vuejs前后端数据交互之从后端请求数据的实例
Aug 11 Javascript
js实现动态添加上传文件页面
Oct 22 Javascript
vue.js指令v-for使用以及下标索引的获取
Jan 31 Javascript
Nuxt v-bind绑定img src不显示的解决
Dec 05 Javascript
vue前端工程的搭建
Mar 31 Vue.js
vue-cli3.0修改打包后的文件名和文件地址,打包后本地运行报错解决
Apr 06 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
Discuz! 5.0.0论坛程序中加入一段js代码,让会员点击下载附件前自动弹出提示窗口
2007/04/18 PHP
PHP 多维数组排序(usort,uasort)
2010/06/30 PHP
Zend Framework数据库操作方法实例总结
2016/12/11 PHP
PHP判断密码强度的方法详解
2017/05/26 PHP
php设计模式之观察者模式实例详解【星际争霸游戏案例】
2020/03/30 PHP
利用JQuery为搜索栏增加tag提示
2009/06/22 Javascript
学习javascript,实现插入排序实现代码
2011/07/31 Javascript
关于JavaScript的面向对象和继承有利新手学习
2013/01/11 Javascript
javascript获取函数名称、函数参数、对象属性名称的代码实例
2014/04/12 Javascript
JS实现可展开折叠层的鼠标拖曳效果
2015/10/09 Javascript
JS实现按比例缩放图片的方法(附C#版代码)
2015/12/08 Javascript
jQueryeasyui 中如何使用datetimebox 取两个日期间相隔的天数
2017/06/13 jQuery
JS非空验证及邮箱验证的实例
2017/08/11 Javascript
JSON对象转化为字符串详解
2017/08/11 Javascript
深入理解react 组件类型及使用场景
2019/03/07 Javascript
create-react-app中添加less支持的实现
2019/11/15 Javascript
python实现的登陆Discuz!论坛通用代码分享
2014/07/11 Python
python中的字典详细介绍
2014/09/18 Python
仅利用30行Python代码来展示X算法
2015/04/01 Python
在Python中操作时间之mktime()方法的使用教程
2015/05/22 Python
Python 判断是否为质数或素数的实例
2017/10/30 Python
Python操作word常见方法示例【win32com与docx模块】
2018/07/17 Python
解决Python中定时任务线程无法自动退出的问题
2019/02/18 Python
Python3将ipa包中的文件按大小排序
2020/04/17 Python
Pycharm安装python库的方法
2020/11/24 Python
世界排名第一的万圣节服装店:Spirit Halloween
2018/10/16 全球购物
澳大利亚Mocha官方网站:包、钱包、珠宝和配饰
2019/07/18 全球购物
大学生饮食配送创业计划书
2014/01/04 职场文书
人力资源专员岗位职责
2014/01/30 职场文书
大学应届生的自我评价
2014/03/06 职场文书
如何写自我鉴定
2014/03/19 职场文书
高三学生评语大全
2014/04/25 职场文书
优秀班主任主要事迹材料
2014/12/16 职场文书
好好学习保证书
2015/02/26 职场文书
mysql中DCL常用的用户和权限控制
2022/03/31 MySQL
Golang连接并操作MySQL
2022/04/14 MySQL