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笔记一 js以及json基础使用说明
May 22 Javascript
javascript string字符串优化问题
Jul 31 Javascript
jQuery获取注册信息并提示实现代码
Apr 21 Javascript
JavaScript中使用指数方法Math.exp()的简介
Jun 15 Javascript
angular实现表单验证及提交功能
Feb 01 Javascript
微信小程序websocket实现聊天功能
Mar 30 Javascript
基于js实现复制内容到操作系统粘贴板过程解析
Oct 11 Javascript
node.js制作一个简单的登录拦截器
Feb 10 Javascript
Vue事件处理原理及过程详解
Mar 11 Javascript
JS错误处理与调试操作实例分析
Apr 13 Javascript
Vue+tracking.js 实现前端人脸检测功能
Apr 16 Javascript
基于vue和bootstrap实现简单留言板功能
May 30 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
最小化数据传输――在客户端存储数据
2006/10/09 PHP
php curl 登录163邮箱并抓取邮箱好友列表的代码(经测试)
2011/04/07 PHP
php登陆页的密码处理方式分享
2013/10/14 PHP
PHP获取QQ达人QQ信息的方法
2015/03/05 PHP
如何使用php实现评委评分器
2015/07/31 PHP
joomla组件开发入门教程
2016/05/04 PHP
PHP PDOStatement::bindColumn讲解
2019/01/30 PHP
PHP判断一个变量是否为整数、正整数的方法示例
2019/09/11 PHP
laravel-admin表单提交隐藏一些数据,回调时获取数据的方法
2019/10/08 PHP
浅谈laravel 5.6 安装 windows上使用composer的安装过程
2019/10/18 PHP
php的RSA加密解密算法原理与用法分析
2020/01/23 PHP
Laravel5.5+ 使用API Resources快速输出自定义JSON方法详解
2020/04/06 PHP
Yii 框架使用数据库(databases)的方法示例
2020/05/19 PHP
jquery异步调用页面后台方法‏(asp.net)
2011/03/01 Javascript
Js sort排序使用方法
2011/10/17 Javascript
深入理解JavaScript中的箭头函数
2015/07/28 Javascript
使用CamanJS在Web页面上处理图像的技巧
2015/08/18 Javascript
使用struts2+Ajax+jquery验证用户名是否已被注册
2016/03/22 Javascript
Highcharts入门之简介
2016/08/02 Javascript
微信小程序 删除项目工程实现步骤
2016/11/10 Javascript
Vue.Draggable拖拽功能的配置使用方法
2020/07/29 Javascript
Webpack中loader打包各种文件的方法实例
2019/09/03 Javascript
详细介绍Python函数中的默认参数
2015/03/30 Python
Python 批量合并多个txt文件的实例讲解
2018/05/08 Python
对pytorch网络层结构的数组化详解
2018/12/08 Python
基于YUV 数据格式详解及python实现方式
2019/12/09 Python
html5超简单的localStorage实现记住密码的功能实现
2017/09/07 HTML / CSS
德国低价购买灯具和家具网站:Style-home.de
2016/11/25 全球购物
手机配件第一品牌:ZAGG
2017/05/28 全球购物
美国著名的户外用品品牌:L.L.Bean
2018/01/05 全球购物
公司委托书范本5篇
2014/09/20 职场文书
幼儿园重阳节活动总结
2015/05/05 职场文书
2015年城管执法工作总结
2015/07/23 职场文书
JavaScript嵌入百度地图API的最详细方法
2021/04/16 Javascript
Python 内置函数速查表一览
2021/06/02 Python
详解Python自动化之文件自动化处理
2021/06/21 Python