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 相关文章推荐
javascript 常用关键字列表集合
Dec 04 Javascript
jQuery实现点击后标记当前菜单位置(背景高亮菜单)效果
Aug 22 Javascript
JS实现为排序好的字符串找出重复行的方法
Mar 02 Javascript
Bootstrap框架动态生成Web页面文章内目录的方法
May 12 Javascript
AngularJS包括详解及示例代码
Aug 17 Javascript
jQuery+正则+文本框只能输入数字的实现方法
Oct 07 Javascript
JS 在数组指定位置插入/删除数据的方法
Jan 12 Javascript
Node.js Express 框架 POST方法详解
Jan 23 Javascript
BootStrap实现带关闭按钮功能
Feb 15 Javascript
解决浏览器会自动填充密码的问题
Apr 28 Javascript
iview table render集成switch开关的实例
Mar 14 Javascript
vue使用require.context实现动态注册路由
Dec 25 Vue.js
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
PHP分页函数代码(简单实用型)
2010/12/02 PHP
一个经典的PHP文件上传类分享
2014/11/18 PHP
php使用unset()删除数组中某个单元(键)的方法
2015/02/17 PHP
php获取本周开始日期和结束日期的方法
2015/03/09 PHP
Symfony2在Nginx下的配置方法图文教程
2016/02/04 PHP
PHP6新特性分析
2016/03/03 PHP
php简单实现单态设计模式的方法分析
2017/07/28 PHP
JavaScript入门学习书籍推荐
2008/06/12 Javascript
早该知道的7个JavaScript技巧
2013/03/27 Javascript
js判断运行jsp页面的浏览器类型以及版本示例
2013/10/30 Javascript
JavaScript输出当前时间Unix时间戳的方法
2015/04/06 Javascript
js实现仿qq消息的弹出窗效果
2016/01/06 Javascript
详解@angular/cli 改变默认启动端口两种方式
2018/11/29 Javascript
微信小程序模板template简单用法示例
2018/12/04 Javascript
详解Vue This$Store总结
2018/12/17 Javascript
vue响应式更新机制及不使用框架实现简单的数据双向绑定问题
2019/06/27 Javascript
js实现左右轮播图
2020/01/09 Javascript
让python在hadoop上跑起来
2016/01/27 Python
Python做智能家居温湿度报警系统
2018/09/25 Python
pytorch permute维度转换方法
2018/12/14 Python
如何打包Python Web项目实现免安装一键启动的方法
2020/05/21 Python
python和php哪个容易学
2020/06/19 Python
英国100%防污和防水的靴子:Muck Boot Company
2020/09/08 全球购物
在SQL Server中创建数据库主要有那种方式
2013/09/10 面试题
热能动力工程毕业生自荐信
2013/11/07 职场文书
2014年自我评价
2014/01/04 职场文书
大学生就业意向书范文
2014/04/01 职场文书
大学生村官座谈会发言材料
2014/05/25 职场文书
三严三实对照检查材料
2014/08/25 职场文书
医院深入开展党的群众路线教育实践活动实施方案
2014/08/27 职场文书
建筑工地文明标语
2014/10/09 职场文书
2014年世界艾滋病日宣传活动总结
2014/11/18 职场文书
党员发展大会主持词
2015/07/03 职场文书
pytorch 实现在测试的时候启用dropout
2021/05/27 Python
sql时间段切分实现每隔x分钟出一份高速门架车流量
2022/02/28 SQL Server
JS中forEach()、map()、every()、some()和filter()的用法
2022/05/11 Javascript