深入浅析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 相关文章推荐
通过MSXML2自动获取QQ个人头像及在线情况(给初学者)
Jan 22 Javascript
jQuery获取Select选择的Text和Value(详细汇总)
Jan 25 Javascript
jQuery的:parent选择器定义和用法
Jul 01 Javascript
Angular用来控制元素的展示与否的原生指令介绍
Jan 07 Javascript
jQuery过滤选择器详解
Jan 13 Javascript
JavaScript实现控制打开文件另存为对话框的方法
Apr 17 Javascript
jQuery实现自动调整字体大小的方法
Jun 15 Javascript
jquery实现的判断倒计时是否结束代码
Feb 05 Javascript
layui 给数据表格加序号的方法
Aug 20 Javascript
vue 自定义指令自动获取文本框焦点的方法
Aug 25 Javascript
node省市区三级数据性能测评实例分析
Nov 06 Javascript
vue3中轻松实现switch功能组件的全过程
Jan 07 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
php使用exec shell命令注入的方法讲解
2013/11/12 PHP
PHP中使用smarty生成静态文件的例子
2014/04/24 PHP
php使用cookie保存登录用户名的方法
2015/01/26 PHP
php编写简单的文章发布程序
2015/06/18 PHP
PHP面向对象程序设计模拟一般面向对象语言中的方法重载(overload)示例
2019/06/13 PHP
jQuery live( type, fn ) 委派事件实现
2009/10/11 Javascript
基于jQuery的淡入淡出可自动切换的幻灯插件
2010/08/24 Javascript
快速解决jQuery与其他库冲突的方法介绍
2014/01/02 Javascript
简单的jQuery入门指引
2015/07/28 Javascript
JS+CSS3制作炫酷的弹窗效果
2016/11/08 Javascript
js实现HashTable(哈希表)的实例分析
2016/11/21 Javascript
js移动焦点到最后位置的简单方法
2016/11/25 Javascript
使用ionic切换页面卡顿的解决方法
2016/12/16 Javascript
JavaScript中值类型和引用类型的区别
2017/02/23 Javascript
jQuery实现返回顶部按钮和scroll滚动功能[带动画效果]
2017/07/05 jQuery
nodejs中解决异步嵌套循环和循环嵌套异步的问题
2017/07/12 NodeJs
JavaScript事件处理程序详解
2017/09/19 Javascript
深入理解JavaScript和TypeScript中的class
2018/04/22 Javascript
简单了解Ajax表单序列化的实现方法
2019/06/14 Javascript
使用js实现单链解决前端队列问题的方法
2020/02/03 Javascript
vue使用axios实现excel文件下载的功能
2020/07/16 Javascript
初学Python函数的笔记整理
2015/04/07 Python
Python中设置变量访问权限的方法
2015/04/27 Python
Python基于xlrd模块操作Excel的方法示例
2018/06/21 Python
python 以16进制打印输出的方法
2018/07/09 Python
python创建与遍历List二维列表的方法
2019/08/16 Python
Python求平面内点到直线距离的实现
2020/01/19 Python
canvas实现漂亮的下雨效果的示例
2018/04/18 HTML / CSS
Tostadora意大利:定制T恤
2019/04/08 全球购物
员工考核管理制度
2014/02/02 职场文书
工业自动化专业自荐信范文
2014/04/10 职场文书
幼儿园教研活动总结
2014/04/30 职场文书
水浒传读书笔记
2015/06/25 职场文书
导游词之岳阳楼
2019/09/25 职场文书
深入理解以DEBUG方式线程的底层运行原理
2021/06/21 Java/Android
springboot如何接收application/x-www-form-urlencoded类型的请求
2021/11/02 Java/Android