问题

在 TS 里面 this 关键字一开始让我这个写 C# 的十分惊讶,比如下面的一段代码,注意 initBinding 方法

class Company {
id:number; /**
* 在点击编辑按钮的时候开始初始化 currentCompany 对象
* @param e 触发事件的 tr
*/
constructor(e:JQueryEventObject) {
//省略了初始化字段的代码
this.initBinding();
} /**
* 在这里绑定模态框的事件
*/
initBinding() {
$('#confirmDelete').one('click',this.confirmDelete);
} /**
* 确认删除按钮的行为
* @returns {boolean} 删除是否成功
*/
confirmDelete():boolean {
console.log("确认删除"+this.id);
//省略请求服务器处理的操作
return true;
}
}

initBinding 方法里面,我给一个按钮的 click 事件绑定了一个方法,这个方法会打印一下当前选中的公司的 id

但是,结果让人意外,打印出来的竟然是这个按钮的 id

按照原先学习的 C# 里面面向对象的观念,对象的方法里面的 this 应该是指的这个对象本身,可是在这里的 this 却变成了触发事件的按钮。

分析

让我们想想 js 中是如何定义成员方法的,定义一个属性,属性的值是一个 function ;

所以,在我们调用的这个成员方法的时候实际上是调用的这个属性返回的方法,这个方法其实是与返回他的属性所属的对象是无关的。

换句话来说,成员方法中的 this 要结合调用它的上下文来看待,在上面的例子中,我们是在按钮的 click 事件中调用的 confirmDelete 方法,所以,其中的 this 就是指的这个产生 click 事件的按钮。

解决

为了让 confirmDelete 方法能够找到正确的上下文,我们将事件绑定的部分修改一下:

/**
* 在这里绑定模态框的事件
*/
initBinding() {
$('#comDelete').one('click', Company.deleteCom);
$('#confirmDelete').one('click', ()=>this.confirmDelete());
}

让我们看看编译后的 js 代码:

/**
* 在这里绑定模态框的事件
*/
Company.prototype.initBinding = function () {
var _this = this;
$('#confirmDelete').one('click', function () { return _this.confirmDelete(); });
};

这里生成了一个局部变量 _this ,是当前对象的一个相等的新的实例,通过在一个匿名的函数中调用他的 confirmDelete 方法,这样,就能够正确的解析 this 关键字为我们所希望的当前对象了


参考链接:

TypeScript里的 this

# TypeScript 中如何确保 this 的正确性的更多相关文章

  1. 【TypeScript】如何在TypeScript中使用async/await,让你的代码更像C#。

    [TypeScript]如何在TypeScript中使用async/await,让你的代码更像C#. async/await 提到这个东西,大家应该都很熟悉.最出名的可能就是C#中的,但也有其它语言也 ...

  2. keil mdk中如何确保某一段程序不被优化掉(转)

    源:keil mdk中如何确保某一段程序不被优化掉 使用mdk编程,假如有一个有用的函数你定义了但是没有显式的调用,mdk在默认方式下,将会把这个函数从整个程序总删除掉,以节省ROM. 比如,你在RO ...

  3. TypeScript中的怪语法

    TypeScript中的怪语法 如何处理undefined 和 null undefined的含义是:一个变量没有初始化. null的含义是:一个变量的值是空. undefined 和 null 的最 ...

  4. JavaScript 和 TypeScript 中的 class

    对于一个前端开发者来说,很少用到 class ,因为在 JavaScript 中更多的是 函数式 编程,抬手就是一个 function,几乎不见 class 或 new 的踪影.所以 设计模式 也是大 ...

  5. TypeScript 中的方法重载

    方法重载(overload)在传统的静态类型语言中是很常见的.JavaScript 作为动态语言, 是没有重载这一说的.一是它的参数没有类型的区分,二是对参数个数也没有检查.虽然语言层面无法自动进行重 ...

  6. typescript中的接口

    说到接口:在面向对象的编程中,接口是一种规范的定义,它定义了行为和动作的规范,在程序设计里面,接口起到一种限制和规范的作用.接口定义了某一批类所需要遵守的规范,接口不关心这些类的内部状态数据,也不关心 ...

  7. Typescript中的装饰器原理

    Typescript中的装饰器原理 1.小原理 因为react中的高阶组件本质上是个高阶函数的调用, 所以高阶组件的使用,我们既可以使用函数式方法调用,也可以使用装饰器. 也就是说,装饰器的本质就是一 ...

  8. ES6 中 Class 与 TypeScript 中 Class 的区别(待补充)

    ES6 中 Class 与 TypeScript 中 Class 的区别(待补充)

  9. 在TypeScript中扩展JavaScript基础对象的功能

    最近工作中用到,记录一下:假设我们需要一个功能,把一个数字比如10000输出为下面的字符串格式“10,000”,一般是写一个方法,那么我希望更方便一点,直接向Number类型添加一个格式化方法,比如叫 ...

随机推荐

  1. centos 安装haproxy 1.6.3

    yum install libtermcap-devel ncurses-devel libevent-devel readline-devel gcc gcc-c++ pcre pcre-devel ...

  2. php判断字符串A是否含有字符串B

    <?php if (preg_match ("/PHP/", "PHP is the web scripting language of choice." ...

  3. 解决PHP下导出csv乱码小记

    我们之前都是使用PHPexcel导出我们的一些数据的,由于Phpexcel对导出超出1万条数据会导至超时和内存暴涨,后来我们就改用数据导出成csv格式的. 相信很多朋友们在用PHP导出csv文件时都遇 ...

  4. IOS第11天(2:UIPickerView自定义国旗选择)

    国旗选择 #import "HMViewController.h" #import "HMFlag.h" #import "HMFlagView.h& ...

  5. IOS第八天(7:UITableViewController新浪微博,cell 复用的简单写法优化和cell高度从模型中获取)

    *********** #import "HMViewController.h" #import "HMStatus.h" #import "HMSt ...

  6. 使用 Sublime Text3 编辑 Markdown

    安装插件 可以通过安装 Markdown 的插件来使 Sublime Text3 变成一款 Markdown 编辑器 1.Markdown Preview 插件 输入Shift + Ctrl + P, ...

  7. poj分类

    初期: 一.基本算法:      (1)枚举. (poj1753,poj2965)      (2)贪心(poj1328,poj2109,poj2586)      (3)递归和分治法.      ( ...

  8. 求解PDE的多重网格法(MG)

    多重网格法相对于普通的Jacobi迭代或者G-S迭代等能够得到和未知数的个数成线性的高效运行时间的主要原因在于:迭代初值的一步步接近真值和G_S方法的前面几步的快速收敛性. 先看一张图[1]: 这张图 ...

  9. 阿里云maven加速和docker加速

    maven加速 maven仓库用过的人都知道,国内有多么的悲催.还好有比较好用的镜像可以使用,尽快记录下来.速度提升100倍. http://maven.aliyun.com/nexus/#view- ...

  10. 整理常用的iOS第三方资源

    一:第三方插件 1:基于响应式编程思想的oc 地址:https://github.com/ReactiveCocoa/ReactiveCocoa 2:hud提示框 地址:https://github. ...