深入浅析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 相关文章推荐
JavaScript事件列表解说
Dec 22 Javascript
js类中获取外部函数名的方法
Aug 19 Javascript
JavaScript全局函数使用简单说明
Mar 11 Javascript
Jquery实现图片左右自动滚动示例
Sep 25 Javascript
Js 正则表达式知识汇总
Dec 02 Javascript
jquery实现两边飘浮可关闭的对联广告
Nov 27 Javascript
JS表单验证的代码(常用)
Apr 08 Javascript
js判断radiobuttonlist的选中值显示/隐藏其它模块的实现方法
Aug 25 Javascript
Angular.JS判断复选框checkbox是否选中并实时显示
Nov 30 Javascript
JavaScript 函数节流详解及方法总结
Feb 09 Javascript
在vue-cli项目中使用bootstrap的方法示例
Apr 21 Javascript
JavaScript简单实现动态改变HTML内容的方法示例
Dec 25 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
php过滤html标记属性类用法实例
2014/09/23 PHP
php正则修正符用法实例详解
2016/12/29 PHP
特殊字符、常规符号及其代码对照表
2006/06/26 Javascript
翻译整理的jQuery使用查询手册
2007/03/07 Javascript
window.location.hash 使用说明
2010/11/08 Javascript
jQuery随便控制任意div隐藏的方法
2013/06/28 Javascript
原生js ActiveXObject获取execl里面的值
2013/11/01 Javascript
基于jquery实现的文字淡入淡出效果
2013/11/14 Javascript
javascript生成随机数的方法
2014/05/16 Javascript
window.location的重写及判断location是否被重写
2014/09/04 Javascript
一个JavaScript处理textarea中的字符成每一行实例
2014/09/22 Javascript
Easyui Treegrid改变默认图标的方法
2016/04/29 Javascript
Javascript对象字面量的理解
2016/06/22 Javascript
高效Web开发的10个jQuery代码片段
2016/07/22 Javascript
清除js缓存的多种方法总结
2016/12/09 Javascript
bootstrap表单示例代码分享
2017/05/18 Javascript
bootstrap选项卡扩展功能详解
2017/06/14 Javascript
vue2.5.2使用http请求获取静态json数据的实例代码
2018/02/27 Javascript
Vue 路由切换时页面内容没有重新加载的解决方法
2018/09/01 Javascript
vue src动态加载请求获取图片的方法
2018/10/17 Javascript
javascript实现简易的计算器
2020/01/17 Javascript
es6中class类静态方法,静态属性,实例属性,实例方法的理解与应用分析
2020/02/15 Javascript
vuex实现购物车功能
2020/06/28 Javascript
ssh批量登录并执行命令的python实现代码
2012/05/25 Python
详解Python字典的操作
2019/03/04 Python
python pycharm最新版本激活码(永久有效)附python安装教程
2020/09/18 Python
python使用多线程查询数据库的实现示例
2020/08/17 Python
吉列剃须刀英国官网:Gillette英国
2019/03/28 全球购物
介绍一下grep命令的使用
2015/06/12 面试题
桥梁与隧道工程专业本科生求职信
2013/10/08 职场文书
学校安全检查制度
2014/01/27 职场文书
给客户的检讨书
2014/12/21 职场文书
行政助理岗位职责
2015/02/10 职场文书
2015年药店店长工作总结
2015/04/29 职场文书
学校捐款活动总结
2015/05/09 职场文书
科级干部培训心得体会
2016/01/06 职场文书