ES6 class类链式继承,实例化及react super(props)原理详解


Posted in Javascript onFebruary 15, 2020

本文实例讲述了ES6 class类链式继承,实例化及react super(props)原理。分享给大家供大家参考,具体如下:

class定义类是es6提供的新的api,比较直观,class类继承也有着一定的规律性,在egg, webpack等库的源码中有着很多的应用场景。结合一些初学者可能遇到的难点,本文主要对其链式继承进行总结,关于super关键字的使用请参考我的其他文章es6中super关键字的理解。

class定义

class App {
  constructor(options){
    super() //报错
    //console.log(options)
  }
}
 
class AppChild extends App{
  getConfig(){
    console.log('获取config')
  }
}

class定义类时,constructor不是必须的,可以省略

直接定义类时,不能再constructor中使用super()

class 链式继承

1,省略constructor:

class App {
  constructor(options){
    console.log(options)
  }
}
 
class AppChild extends App{
  getConfig(){
    console.log('获取config')
  }
}
 
class AppGrandson extends AppChild{
  getTime(){
    console.log('获取config')
  }
}
 
new AppGrandson({name:'ceshi'})

在对类进行实例化时,会逐级执行每个类的的constructor,如果类没有constructor,会去查找继承的类,在上层类实例化完毕之后(直到最顶层),再返回执行类的实例化。

看到这里是不是想起什么,是不是很像一些中间件的执行过程,先进入到最底层,执行完后再返回。是的,class类实例化过程类似于洋葱模型,先进后出。

所以上面的代码在最上层的类也能获取到传入的参数。

2,带有super的类继承

class App {
  constructor(options){
    console.log(options)
  }
}
 
class AppChild extends App{
  constructor(options){
    super({
      ...options,
      age:22
    })
    this.family = () => {
      return {
        familyName:'child'
      }
    }
  }
  getConfig(){
    console.log('获取config')
  }
}
 
class AppGrandson extends AppChild{
  getTime(){
    console.log('获取config')
  }
}
 
new AppGrandson({name:'ceshi'})

上面的代码在中间类添加了super(),super是什么呢,es6提供的关键字,用来继承的,具体用法参见:es6中super关键字的理解

加入super之后,最后顶层获取的options就被super修改了。这是为什么呢,通过调试可以发现,super()执行时,会去执行其所继承类的constructor,当父级类完成初始化之后,才会去执行super()之后的逻辑。

简单的说,super()是父级类实例化的入口

3,模拟实现react中class类,super(props)之后,可以使用this.props

class Component{
  constructor(options){
    console.log(options)
    //这里的this指的是实例化时入口类对应的实例
    //在用app进行实例化时,这里的this指的是App实例
    this.props = options
  }
}
 
class App extends Component{
  constructor(props){
    super(props)//去执行父级类的实例化
    console.log(this.props)
  }
  componentDidMount() {
    //...
  }
}
 
 
new App({name:'ceshi'})

实例化时,执行到super(props),去实例化Componet, 给this.props赋值,注意这时这里的this指的是App对应的实例,并不是Component,这是一个关键点。

当Component实例化后,再执行console.log(this.props),当然可以获取到值。

总结

1,class类实例化时,对应的this指向的是最外层类(入口类)对应的实例

2,链式继承对应的实例化是洋葱圈模型,先进入到最底层类实例化,再返回

3,super是class类constructor对应的入口,super(options)对应的参数就是constructor对应的参数

感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试上述代码运行效果。

更多关于JavaScript相关内容可查看本站专题:《javascript面向对象入门教程》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
IE与firefox之jquery用法区别
Oct 03 Javascript
javascript 24小时弹出一次的代码(利用cookies)
Sep 03 Javascript
jQuery设置指定网页元素宽度和高度的方法
Mar 25 Javascript
JavaScript获取按钮所在form表单id的方法
Apr 02 Javascript
如何利用JS通过身份证号获取当事人的生日、年龄、性别
Jan 22 Javascript
Extjs 点击复选框在表格中增加相关信息行
Jul 12 Javascript
AngularJS bootstrap启动详解及实例代码
Sep 14 Javascript
jquery实时获取时间的简单实例
Jan 26 Javascript
jQuery实现链接的title快速出现的方法
Feb 20 Javascript
JSONP跨域请求
Mar 02 Javascript
jQuery实现checkbox全选、反选及删除等操作的方法详解
Aug 02 jQuery
Weex开发之地图篇的具体使用
Oct 16 Javascript
ES6 Iterator遍历器原理,应用场景及相关常用知识拓展详解
Feb 15 #Javascript
es6 super关键字的理解与应用实例分析
Feb 15 #Javascript
es6中class类静态方法,静态属性,实例属性,实例方法的理解与应用分析
Feb 15 #Javascript
Vue父子传递实例讲解
Feb 14 #Javascript
Javascript操作select控件代码实例
Feb 14 #Javascript
微信小程序复选框实现多选一功能过程解析
Feb 14 #Javascript
node.js使用net模块创建服务器和客户端示例【基于TCP协议】
Feb 14 #Javascript
You might like
zf框架db类的分页示例分享
2014/03/14 PHP
php计算函数执行时间的方法
2015/03/20 PHP
PHP基本语法实例总结
2016/09/09 PHP
thinkphp制作404跳转页的简单实现方法
2016/09/22 PHP
网页javascript精华代码集
2007/01/24 Javascript
javascript String 对象
2008/04/25 Javascript
javascript与CSS复习(三)
2010/06/29 Javascript
分享27款非常棒的jQuery 表单插件
2011/03/28 Javascript
javascript中的继承实例代码
2011/04/27 Javascript
解决遍历时Array.indexOf产生的性能问题
2012/07/03 Javascript
基于javascipt-dom编程 table对象的使用
2013/04/22 Javascript
javascript 构造函数方式定义对象
2015/01/02 Javascript
jQuery插件Slider Revolution实现响应动画滑动图片切换效果
2015/06/05 Javascript
jquery实现鼠标滑过小图查看大图的方法
2015/07/20 Javascript
Node.js DES加密的简单实现
2016/07/07 Javascript
Javascript实现基本运算器
2017/07/15 Javascript
vue页面更新patch的实现示例
2020/03/25 Javascript
python实现自动登录人人网并访问最近来访者实例
2014/09/26 Python
Python中的异常处理学习笔记
2015/01/28 Python
Python 正则表达式实现计算器功能
2017/04/29 Python
用Python写王者荣耀刷金币脚本
2017/12/21 Python
在Python中利用pickle保存变量的实例
2019/12/30 Python
python requests包的request()函数中的参数-params和data的区别介绍
2020/05/05 Python
Looking4Parking美国:全球排名第一的机场停车比较品牌
2019/08/26 全球购物
如何将一个描述日期或日期/时间的字符串转换为一个Date对象
2015/10/13 面试题
工厂仓管员岗位职责
2014/01/01 职场文书
基层干部十八大感言
2014/01/19 职场文书
工程管理英文求职信
2014/03/18 职场文书
入党积极分子评语
2014/05/04 职场文书
刑事辩护授权委托书
2014/09/13 职场文书
评职称个人总结
2015/03/05 职场文书
2016年全国助残日活动总结
2016/04/01 职场文书
2019新员工心得体会
2019/06/25 职场文书
Python必备技巧之字符数据操作详解
2022/03/23 Python
详解Mysq MVCC多版本的并发控制
2022/04/29 MySQL
mysql sock 文件解析及作用讲解
2022/07/15 MySQL