今天注意到前端小伙伴用react 定义component class的方法的时候是通过箭头函数的方式,表示好奇。

class Test extends React.Component {
public fun1 = () => {
console.log(this);
}; fun2() {
console.log(this);
}
}

 如上代码中fun1的定义方式。于是感到好奇,fun1中的this是什么。

如果我们套用箭头函数的概念,我们可能认为,这中间的this是否会指向环境变量global或window。然而却不是这样的,而是指向new Test()实例。

我们可以看以下的等价写法:

class Test extends React.Component {
constructor() {
super();
this.fun1 = () => {
console.log(this);
};
} fun2() {
console.log(this);
}
}

也就是在属性默认值中定义的箭头函数,等价于构造函数中的定义,所有this指向的是实例。

那么为何要用定义箭头函数属性的方式来定义方法呢?

它和fun2的方式的this指向的不是都是实例吗?

const obj = new Test();
obj.fun1();// 指向obj
obj.fun2();// 指向obj //差异
const fun1=obj.fun1;
const fun2=obj.fun2; fun1();// 指向obj
fun2();// global

如上代码,我们如果直接用实例来调用,则没什么差异。

但是,当我们先赋值给变量,由于fun2是绑定调用者的,所以这里为全局变量。

所以直接定义箭头函数属性的效果在于它直接绑定了实例,可以直接使用,这个对应react的jsx中使用是比较方便的,不然使用fun2模式,就需要手动绑定this再使用。

typescript 属性默认值使用箭头函数 this指向问题的更多相关文章

  1. typescript 关于class属性类型定义被属性默认值覆盖的问题及解决方式

    问题来源于 React.component的第二个参数的类型定义问题,我构建了以下简化demo,方便描述问题: class P<STATE> { public state: STATE; ...

  2. HTML标签CSS属性默认值汇总

    HTML标签CSS属性默认值,在你需要还原默认值的时候比较有用. 以前一直在找这份文档,今天偶然在网上看到了.除了inline和block的定义,主要是要注意body|h1~h6|blockquote ...

  3. ES6 箭头函数 this 指向

    ES6 箭头函数 this 指向 箭头函数有几个使用注意点: 函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象. 不可以当作构造函数,也就是说,不可以使用new命令,否则会抛出一个 ...

  4. ES6 箭头函数this指向问题

    var name = "window"; var person1 = { name: "person1", show1: function() { consol ...

  5. 箭头函数this指向问题

    this指向本质 箭头函数this指向的固定化,并不是因为箭头函数内部有绑定this的机制,实际原因是箭头函数根本没有自己的this,导致内部的this就是外层代码块的this.正是因为它没有this ...

  6. ES6新特性(函数默认参数,箭头函数)

    ES6新特性之 函数参数的默认值写法 和 箭头函数. 1.函数参数的默认值 ES5中不能直接为函数的参数指定默认值,只能通过以下的变通方式:   从上面的代码可以看出存在一个问题,当传入的参数为0或者 ...

  7. PropertyGrid—默认属性,默认事件,属性默认值

    零.引言 PropertyGrid显示一个对象的属性和事件时,可以设置其默认属性和事件,也就是当你选中对象时,propertyGrid中焦点在哪一个属性或事件上.为对象的属性提供默认值,使Proper ...

  8. SQL 语句修改列名 属性 默认值

    --修改字段名exec sp_rename '表名.列名','新列名' --修改字段属性alter table 表名 alter column 列名 nvarchar(100) null; --修改默 ...

  9. C#属性默认值设置

    关于在MVC中view中设置默认值,可以象如下设置: 1.关于VIEWMODEL的部分 如果是C#  6.0,网上资料查到说可以 如果语法不支持,只能改回.net 2.0的写法. public cla ...

随机推荐

  1. Java线程池ThreadPoolExecutor原理和用法

    1.ThreadPoolExecutor构造方法 public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAli ...

  2. idea本地调试spark,hive,kafka

    https://note.youdao.com/share/?id=753c443aa4a665679d8d00c9c50363b0&type=note#/

  3. Go 基准测试

        文章转载地址:https://www.flysnow.org/2017/05/21/go-in-action-go-benchmark-test.html 什么是基准测试?      基准测试 ...

  4. libc++abi.dylib: terminating with uncaught exception of type NSException (lldb)

    In Xcode 9 and Swift 4: Print exception stack to know the reason of the exception: Go to show break ...

  5. react初探(一)之JSX、状态(state)管理、条件渲染、事件处理

    前言: 最近收到组长通知我们项目组后面新开的项目准备统一技术栈为react,目前我的情况是三大框架只会angular和Vue.在实际项目中只使用过一次angular5,其余项目都是使用Vue写的.写篇 ...

  6. 下载了好久的IntelliJ IDEA一直没用

    今天想试一下然后打开了IJ,发现我居然一直没有配置JDK macos 配置完全按照这个一步步走下去就好了 https://jingyan.baidu.com/album/597a0643336e263 ...

  7. 开发者的自测利器-Hprof命令(寻找cpu热点)

    测试代码: public class HProfTest { public void slowMethod() { try { Thread.sleep(1000); } catch (Excepti ...

  8. 获取的输入内容,没有被P标签包裹的文本和元素进行处理

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. oracle 将一个表复制到另外一个表里 .

    复制一个表到另一个表.视图.临时表 博客分类: oracle Oracle数据结构软件测试SQL 创建一个表new_table和old_table表结构一样(没有old_table的记录) creat ...

  10. 『计算机视觉』YOLO系列总结

    网络细节资料很多,不做赘述,主要总结演化思路和解决问题. 一.YOLO 1.网络简介 YOLO网络结构由24个卷积层与2个全连接层构成,网络入口为448x448(v2为416x416),图片进入网络先 ...