博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
class - function ES6类的方法的两种定义方式及调用方式
阅读量:6758 次
发布时间:2019-06-26

本文共 1702 字,大约阅读时间需要 5 分钟。

方式

import * as React from 'react';const { PureComponent, Fragment } = React;class Test extends PureComponent {    render() {        return (            
); } // 方式一,常规定义方式 doClick() { console.log(this); } // 方式二,箭头函数定义方式 doClick2 = () => { console.log(this); }}export default Test复制代码

区别

  1. 正确调用的方式的不同

    若在上面的示例中的两个按钮上面加上如下的点击事件:

    render() {    return (        
    );}复制代码

    分别点击两个按钮后,会打印出上面信息?是这样的:

    doClick() {    console.log(this);  // undefined}复制代码
    doClick2 = () => {    console.log(this);  // Test {props: {…}, context: {…}, refs: {…}, updater: {…}, state: {…}, …}}复制代码

    使用方式一进行定义的 doClick 方法内部的 thisundefined,之所以出现这种情况,原因在于用这种方式进行定义的方法,其内部 this 的具体指向需要等到运行时才会进行动态的绑定。上面代码中将 doClick 方法赋值给了 button 的点击事件,而 this 会指向所属函数的调用者(拥有者),点击事件由浏览器的事件处理线程进行执行,这时 this 的指向便不再是当前类的实例了。

    解决办法有两种:

    1. 在类的 constructor 中进行手动绑定:

      constructor(props) {    super(props);    this.doClick = this.doClick.bind(this);}复制代码

      即通过 bind 方法将 doClick 方法内部的 this 绑定到当前类的实例并返回了一个新的函数, 然后将新函数赋值给类的自有属性 doClick ,当点击按钮调用 doClick 方法时,则是调用的这个新函数。

    2. 在调用的时候用箭头函数进行包裹:

      复制代码

      这样做也可以正确运行,是因为箭头函数内部本身不存在 this ,箭头函数内部的 this 即是外层的 this ,而且 this 的绑定在定义时便已完成并固定,会绑定到函数所属的对象,而不是在运行时动态绑定的。所以这里的 this.doClick()this 指向的是 render 方法里面的 this ,即当前类的实例,那么由实例去调用 doClick 方法,则可以保证 doClick 方法里面的 this 也是正确指向当前实例的。

      但是,这种解决方式是不值得推荐的,因为没必要多加一层没有额外操作的匿名函数,而且每次 render 时,都会创建不同的匿名函数,当这个匿名函数被当做 prop 向下传递时,可能会导致子元素会做额外的重新渲染。

    根据上面的解释,使用箭头函数定义的 onClick2 在不经过额外的处理后,可以直接赋值给按钮的点击事件并能够正确运行就不难理解了。

  2. 存在于类的位置不同

    使用常规方式定义的方法,存在于类的原型对象上面,子类是可以继承到此方法的;而使用箭头函数定义的方法则属于类的自有方法, 子类是无法继承的。

转载地址:http://sgzeo.baihongyu.com/

你可能感兴趣的文章
swoole重启机制(转载)
查看>>
hadoop day 1
查看>>
HDU 1251 统计难题
查看>>
用javascript脚本实现微信定时发送信息
查看>>
MongoDB学习笔记(四) 用MongoDB的文档结构描述数据关系
查看>>
[Windows Azure] Data Management and Business Analytics
查看>>
java面试题07
查看>>
什么是面向对象思想
查看>>
Quick-cocos2d-x3.3 Study (十六)--------- 碰撞检测,事件监听,设置掩码
查看>>
tomcat 安装
查看>>
C#调用c++创建的dll
查看>>
12.02个人博客
查看>>
Notification通知代码简洁使用
查看>>
UIView 动画
查看>>
ssh加密公私钥
查看>>
快速部署Python应用:Nginx+uWSGI配置详解
查看>>
mybatis-generator生成数据对象
查看>>
java Queue中 add/offer,element/peek,remove/poll区别
查看>>
一个继承了抽象类的普通类的执行顺序
查看>>
Map集合中key不存在时使用toString()方法、valueOf()方法和强制转换((String))之间的区别...
查看>>