问题

在 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. linux笔记六-------文件权限设置

    1.文件(目录)权限本身划分:读read   写write   执行execute 权限从用户的角度划分:主人权限user    同组用户权限group    其他组用户的权限other music. ...

  2. github page 构建自己的页面

    新建一个仓库.命名为:<你的账号>.github.io 然后上传一个index.html即可 打开浏览器输入:<你的账号>.github.io 即可访问

  3. 笔记本(WIN7|XP)发射wifi信号 当无线路由使用

    Windows7系统 第一步:是你的电脑上要有两个网卡一个有线一个无线(笔记本应该都有)台式机可以考虑买个USB无线网卡(50左右) 第二步:win+R  CMD  输入(只输入红色部分) netsh ...

  4. NY-字符串替换

    描述编写一个程序实现将字符串中的所有"you"替换成"we" 输入 输入包含多行数据 每行数据是一个字符串,长度不超过1000 数据以EOF结束 输出 对于输入 ...

  5. BizTalk开发系列(四) 深入Map测试

    在BizTalk的开发过程中XML消息间的映射是一个很重要的内容.如果只是一般的从源节点的值复制到目标节点的话,BizTalk项目提供的 MAP测试和验证就已经可以满足需求了.但是很多时候需要在映射的 ...

  6. 10.5.2 Boot Block 启动块 - 操作系统教程

    简单一篇文章明白地讲解了计算机操作系统的启动过程 OPERATING SYSTEM CONCEPTS ABRAHAM SILBERSCHATZ PETER BAER GALVIN GREG GAGNE ...

  7. 本地化word复制来的网页中的图片

    复制一个网页到word文档中,图片会以链接到网页里图片,而不是本地化保存在文档里.为了让图片存在文档里,而不是每次链接到外部,可以这样做. 全选文档,菜单栏里的编辑,点击链接,断开所有链接. 然后再复 ...

  8. 使用 Git@OSC 管理代码

    开源中国的 git 服务的地址是:http://git.oschina.net/ 以下记录 push 本地已有的项目至 git@osc 的过程. ① 注册登录之后,创建一个自己的项目: 创建好的默认项 ...

  9. fopen w c

    http://php.net/manual/en/function.fopen.php

  10. 一步一步来做WebQQ机器人-(四)(获取好友列表和群列表)

    × 本篇主要是: 获取好友列表,群列表 我会尽量详细一点,尽我所知的分享一些可能大家已经掌握的或者还不清楚的经验 利于大家阅读,文章样式不再复杂化,根据内容取固定色 目前总进度大概65% 全系列预计会 ...