问题

在 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. 使用花生壳6.5客户端FTP设置

    1.打开FTP客户端—选项—参数选择 2.设置为主动模式(PORT) 3.连接FTP服务器 4.FTP连接成功

  2. C语言100道经典算法

    经典的100个c算法 C语言的学习要从基础,100个经典的算法真不知道关于语言的应该发在那里,所以就在这里发了,发贴的原因有2个,第一个,这东西非常值得学习,第二个,想..........嘿嘿,大家应 ...

  3. junit测试框架

    import junit.framework.Assert; import org.junit.After; import org.junit.Before; import org.junit.Tes ...

  4. mango-1.4.1 文档

    文档目录 快速开始 添加依赖包 数据库准备 创建HelloWorld类 书写插入与查询方法 构造数据源并初始化mango对象 获取dao并调用插入与查询方法 查看完整示例代码和表结构 基本操作 准备工 ...

  5. git总是出现untracked content怎么解决?

    git rm --cached vendor/plugins/open_flash_chart_2 rm -rf vendor/plugins/open_flash_chart_2/.git # BA ...

  6. JavaScript 回调函数中的 return false 问题

    今天一个同事问了我一个问题,就是在 Ajax 方法中,请求成功后(success)的回调函数中根据响应的值来判断程序是否继续执行,他不解的是在回调函数中已经 return false 了,但是 Aja ...

  7. 《最终幻想XV》中角色AI的意识决策系统解析

    http://gad.qq.com/article/detail/7155321

  8. How to bind data to a user control

    http://support.microsoft.com/kb/327413 Create a user control  by inheriting from the System.Windows. ...

  9. 浏览器中Javascript单线程分析

    线程这个特性对于一门语言环境来说是尤其重要的,在Java/C++环境下都提供了多线程API操作. 但在Javascript中据说代码执行时单线程的,大量计算的逻辑会阻塞浏览器HTML渲染,但setTi ...

  10. CentOS7安装配置redis-3.0.0

    一.安装必要包 yum install gcc 二.linux下安装 #下载 wget http://download.redis.io/releases/redis-3.0.0.tar.gz tar ...