深入浅析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 相关文章推荐
Json序列化和反序列化方法解析
Dec 19 Javascript
JavaScript中Math对象方法使用概述
Jan 02 Javascript
jQuery学习笔记之toArray()
Jun 09 Javascript
js数组的基本操作(很全自己整理的)
Oct 16 Javascript
如何用javascript计算文本框还能输入多少个字符
Jul 29 Javascript
innerHTML中标签可以换行的方法汇总
Aug 14 Javascript
Node.js的项目构建工具Grunt的安装与配置教程
May 12 Javascript
微信小程序实现文件、图片上传功能
Aug 18 Javascript
Angular中innerHTML标签的样式不起作用的原因解析
Jun 18 Javascript
关于JS模块化的知识点分享
Oct 16 Javascript
JavaScript indexOf()原理及使用方法详解
Jul 09 Javascript
Node.js利用Express实现用户注册登陆功能(推荐)
Oct 26 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中strlen()和mb_strlen()的区别浅析
2014/06/19 PHP
修改WordPress中文章编辑器的样式的方法详解
2015/12/15 PHP
基于ThinkPHP实现的日历功能实例详解
2017/04/15 PHP
Laravel利用gulp如何构建前端资源详解
2018/06/03 PHP
PHP随机数函数rand()与mt_rand()的讲解
2019/03/25 PHP
javascript 对象定义方法 简单易学
2009/03/22 Javascript
AppBaseJs 类库 网上常用的javascript函数及其他js类库写的
2010/03/04 Javascript
ExtJS 2.0 GridPanel基本表格简明教程
2010/05/25 Javascript
ASP.NET jQuery 实例4(复制TextBox的文本到本地剪贴板上)
2012/01/13 Javascript
js/ajax跨越访问-jsonp的原理和实例(javascript和jquery实现代码)
2012/12/27 Javascript
jquery左右滚动焦点图banner图片鼠标经过显示上下页按钮
2013/10/11 Javascript
原生javascript实现图片弹窗交互效果
2015/01/12 Javascript
JavaScript里实用的原生API汇总
2015/05/14 Javascript
详解BootStrap中Affix控件的使用及保持布局的美观的方法
2016/07/08 Javascript
关于不同页面之间实现参数传递的几种方式讨论
2017/02/13 Javascript
React Native 通告消息竖向轮播组件的封装
2020/08/25 Javascript
vue-cli4使用全局less文件中的变量配置操作
2020/10/21 Javascript
js实现电灯开关效果
2021/01/19 Javascript
正确理解python中的关键字“with”与上下文管理器
2017/04/21 Python
python面试题小结附答案实例代码
2019/04/11 Python
python3字符串操作总结
2019/07/24 Python
关于torch.optim的灵活使用详解(包括重写SGD,加上L1正则)
2020/02/20 Python
Python通过Tesseract库实现文字识别
2020/03/05 Python
Python读写压缩文件的方法
2020/07/30 Python
Python实现像awk一样分割字符串
2020/09/15 Python
酒店端午节促销方案
2014/02/18 职场文书
超市创业计划书
2014/04/24 职场文书
市场调查策划方案
2014/06/10 职场文书
初中差生评语
2014/12/29 职场文书
档案工作个人总结
2015/03/03 职场文书
英文自荐信范文
2015/03/25 职场文书
工作迟到检讨书范文
2015/05/06 职场文书
盲山观后感
2015/06/11 职场文书
redis 限制内存使用大小的实现
2021/05/08 Redis
详解Redis主从复制实践
2021/05/19 Redis
python中的sys模块和os模块
2022/03/20 Python