深入浅析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表单提交的代码
Sep 13 Javascript
jquery ajax 检测用户注册时用户名是否存在
Nov 03 Javascript
JQuery验证工具类搜集整理
Jan 16 Javascript
给js文件传参数(详解)
Jul 13 Javascript
node.js中的fs.appendFile方法使用说明
Dec 17 Javascript
EasyUI实现第二层弹出框的方法
Mar 01 Javascript
javascript中几个容易混淆的概念总结
Apr 14 Javascript
Node.js服务器环境下使用Mock.js拦截AJAX请求的教程
May 23 Javascript
jQuery图片加载显示loading效果
Nov 04 Javascript
js实现无缝滚动图
Feb 22 Javascript
Vuejs 组件——props数据传递的实例代码
Mar 07 Javascript
jQuery实现简单的下拉菜单导航功能示例
Dec 07 jQuery
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的Laravel框架中Eloquent对象关系映射使用
2016/02/26 PHP
PHP实现SMTP邮件的发送实例
2018/09/27 PHP
在laravel框架中使用model层的方法
2019/10/08 PHP
jquery CSS选择器笔记
2010/03/29 Javascript
使用JS读秒使用示例
2013/09/21 Javascript
简介JavaScript中POSITIVE_INFINITY值的使用
2015/06/05 Javascript
JS实现的随机排序功能算法示例
2017/06/09 Javascript
极简主义法编写JavaScript类
2017/11/02 Javascript
jQuery使用动画队列自定义动画操作示例
2018/06/16 jQuery
原生JS实现DOM加载完成马上执行JS代码的方法
2018/09/07 Javascript
jQuery-ui插件sortable实现自由拖动排序
2018/12/01 jQuery
iview的table组件自带的过滤器实现
2019/07/12 Javascript
浅谈JavaScript中this的指向问题
2020/07/28 Javascript
[03:49]2016完美“圣”典风云人物:AMS专访
2016/12/06 DOTA
基于Python Shell获取hostname和fqdn释疑
2016/01/25 Python
对Python3.x版本print函数左右对齐详解
2018/12/22 Python
Python数据类型之列表和元组的方法实例详解
2019/07/08 Python
Python中zipfile压缩文件模块的基本使用教程
2020/06/14 Python
Python连接mysql数据库及简单增删改查操作示例代码
2020/08/03 Python
python线程池 ThreadPoolExecutor 的用法示例
2020/10/10 Python
python Autopep8实现按PEP8风格自动排版Python代码
2021/03/02 Python
美国乒乓球设备、配件和服装品牌:Killerspin
2020/06/07 全球购物
李维斯牛仔裤荷兰官方网站:Levi’s NL
2020/08/23 全球购物
日本AOKI官方商城:AOKI西装
2020/06/11 全球购物
大学生文员专业个人求职信范文
2014/01/05 职场文书
高一地理教学反思
2014/01/18 职场文书
安全生产网格化管理实施方案
2014/03/01 职场文书
安全承诺书范文
2014/03/26 职场文书
大学理论知识学习自我鉴定
2014/04/28 职场文书
创意婚礼策划方案
2014/05/18 职场文书
公民代理授权委托书
2014/09/24 职场文书
县政府办公室领导班子对照检查材料思想汇报
2014/09/28 职场文书
2014年招商引资工作总结
2014/11/22 职场文书
2015年度企业工作总结
2015/05/21 职场文书
2015年科学教研组工作总结
2015/07/22 职场文书
“学党章、守党纪、讲党规”学习心得体会
2016/01/14 职场文书