深入浅析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 中debug方式
Feb 07 Javascript
基于jquery1.4.2的仿flash超炫焦点图播放效果
Apr 20 Javascript
子页向父页传值示例
Nov 27 Javascript
点击表单提交时出现jQuery没有权限的解决方法
Jul 23 Javascript
JQuery中的事件及动画用法实例
Jan 26 Javascript
js闭包实现按秒计数
Apr 23 Javascript
jquery特效 点击展示与隐藏全文
Dec 09 Javascript
详解JavaScript权威指南之对象
Sep 27 Javascript
vue实现留言板todolist功能
Aug 16 Javascript
JS跳转手机站url的若干注意事项
Oct 18 Javascript
js中对象和面向对象与Json介绍
Jan 21 Javascript
基于JS判断对象是否是数组
Jan 10 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
一个分页的论坛
2006/10/09 PHP
PHP 作用域解析运算符(::)
2010/07/27 PHP
php删除文件夹及其文件夹下所有文件的函数代码
2013/01/23 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(二)
2014/06/23 PHP
php专用数组排序类ArraySortUtil用法实例
2015/04/03 PHP
PHP自带方法验证邮箱、URL、IP是否合法的函数
2016/12/08 PHP
CentOS 上搭建 PHP7 开发测试环境
2017/02/26 PHP
PHP面向对象之里氏替换原则简单示例
2018/04/08 PHP
分享5个非常有用的Laravel Blade指令
2018/05/30 PHP
PHP通过get方法获得form表单数据方法总结
2018/09/12 PHP
用于自动添加Digg This!按钮的JavaScript
2006/12/23 Javascript
简单的js分页脚本
2009/05/21 Javascript
jQuery ui1.7 dialog只能弹出一次问题
2009/08/27 Javascript
javascript初学者常用技巧
2014/09/02 Javascript
javascript获取当前鼠标坐标的方法
2015/01/10 Javascript
script标签属性用type还是language
2015/01/21 Javascript
完美的js div拖拽实例代码
2016/09/24 Javascript
vue.js组件vue-waterfall-easy实现瀑布流效果
2017/08/22 Javascript
详解使用PM2管理nodejs进程
2017/10/24 NodeJs
Vue中正确使用jQuery的方法
2017/10/30 jQuery
Vue结合Video.js播放m3u8视频流的方法示例
2018/05/04 Javascript
vue-router之nuxt动态路由设置的两种方法小结
2018/09/26 Javascript
解读Django框架中的低层次缓存API
2015/07/24 Python
遍历python字典几种方法总结(推荐)
2016/09/11 Python
python脚本作为Windows服务启动代码详解
2018/02/11 Python
Django实现一对多表模型的跨表查询方法
2018/12/18 Python
分析运行中的 Python 进程详细解析
2019/06/22 Python
解决python彩色螺旋线绘制引发的问题
2019/11/23 Python
利用 PyCharm 实现本地代码和远端的实时同步功能
2020/03/23 Python
《美丽的小路》教学反思
2014/02/26 职场文书
整顿机关作风心得体会
2014/09/10 职场文书
村委会贫困证明范本
2014/09/17 职场文书
教师节横幅标语
2014/10/08 职场文书
党员先进事迹材料
2014/12/19 职场文书
工作保证书
2015/01/17 职场文书
vue2的 router在使用过程中遇到的一些问题
2022/04/13 Vue.js