Javascript中的this,bind和that使用实例


Posted in Javascript onDecember 05, 2019

这篇文章主要介绍了Javascript中的this,bind和that使用实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

Javascript中必须通过this来访问类成员,可是this的特点就是函数绑在哪个对象上,它就指向那个对象。这个可能困扰过很多的程序员,特别是从C#,Java等语言过来的程序员。

function Foo(){
  this.message = 'This is message from Foo';
}

Foo.prototype.printMessage = function(){
  console.log(this.message);
}

function Foo2(){
  this.message = 'This is message from Foo2';
}

var foo = new Foo();
foo.printMessage();

var foo2 = new Foo2();
foo2.printMessage = foo.printMessage;
foo2.printMessage();

输出为:

This is message from Foo

This is message from Foo2

主要原因就是this改变了,因此Javascript中this的用法,和C++\C#中的大为不同。如果需要传统方式使用this的函数,可以使用Function.prototype.bind(),指定函数的this值:

function Foo(){
  this.message = 'This is message from Foo';
  
  this.printMessage = (function(){
    console.log(this.message);
  }).bind(this);
}

function Foo2(){
  this.message = 'This is message from Foo2';
}

var foo = new Foo();
foo.printMessage();

var foo2 = new Foo2();
foo2.printMessage = foo.printMessage;
foo2.printMessage();

输出为:

This is message from Foo

This is message from Foo

另外使用call和apply也可以改变函数调用时的this值。

bind函数的主要问题是IE9以后才开始提供。并且一旦开始习惯了Javascript的this用法,这种bind反而会不习惯。在实践中,更多用到的还是保存this:

function Foo(){
  var that = this;
  
  this.message = 'This is message from Foo';
  
  this.printMessage = function(){
    console.log(that.message);
  };
}

function Foo2(){
  this.message = 'This is message from Foo2';
}

var foo = new Foo();
foo.printMessage();

var foo2 = new Foo2();
foo2.printMessage = foo.printMessage;
foo2.printMessage();

输出同上。

注意我们是通过that来访问的message(除了that,context和self也是常用的名称)。Javascript一个还算欣慰的地方就是他的闭包上下文始终是在函数定义的地方,因此不管函数被挂上哪个对象上,捕获到的that始终是这个。当然这个地方不算闭包,有闭无包,但原理是相同的。这也是实践中用的最多的方法,推荐使用。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
加载jQuery后$冲突的解决办法
Jul 09 Javascript
JavaScript Scoping and Hoisting 翻译
Jul 03 Javascript
JS保留小数点(四舍五入、四舍六入)实现思路及实例
Apr 25 Javascript
javascript实现动态加载CSS
Jan 26 Javascript
Javascript中实现String.startsWith和endsWith方法
Jun 10 Javascript
javascript实现网页端解压并查看zip文件
Dec 15 Javascript
微信公众号开发 实现点击返回按钮就返回到聊天界面
Dec 15 Javascript
微信小程序 122100版本更新问题解决方案
Dec 22 Javascript
canvas实现简易的圆环进度条效果
Feb 28 Javascript
HTML5+Canvas调用手机拍照功能实现图片上传(上)
Apr 21 Javascript
vue.js分页中单击页码更换页面内容的方法(配合spring springmvc)
Feb 10 Javascript
localstorage实现带过期时间的缓存功能
Jun 28 Javascript
原生JS与CSS实现软件卸载对话框功能
Dec 05 #Javascript
Vue快速实现通用表单验证功能
Dec 05 #Javascript
Vue组件通信中非父子组件传值知识点总结
Dec 05 #Javascript
基于javascript实现贪吃蛇经典小游戏
Apr 10 #Javascript
微信小程序登录时如何获取input框中的内容
Dec 04 #Javascript
微信小程序日历插件代码实例
Dec 04 #Javascript
微信小程序request请求封装,验签代码实例
Dec 04 #Javascript
You might like
php print EOF实现方法
2009/05/21 PHP
整理的一些实用WordPress后台MySQL操作命令
2013/01/07 PHP
php使用CURL伪造IP和来源实例详解
2015/01/15 PHP
PHP中的命名空间相关概念浅析
2015/01/22 PHP
ThinkPHP的SAE开发相关注意事项详解
2016/10/09 PHP
jquery.cvtooltip.js 基于jquery的气泡提示插件
2010/11/19 Javascript
提取字符串中年月日的函数代码
2013/11/05 Javascript
innerText 使用示例
2014/01/23 Javascript
javascript实现Table排序的方法
2015/05/15 Javascript
jQuery预加载图片常用方法
2015/06/15 Javascript
Javascript实现字数统计
2015/07/03 Javascript
js友好的时间返回函数
2016/08/24 Javascript
jQuery实现简洁的轮播图效果实例
2016/09/07 Javascript
微信小程序 获取当前地理位置和经纬度实例代码
2016/12/05 Javascript
angularjs实现简单的购物车功能
2017/09/21 Javascript
JS操作Fckeditor的一些常用方法(获取、插入等)
2020/02/19 Javascript
ES6函数实现排它两种写法解析
2020/05/13 Javascript
vue中移动端调取本地的复制的文本方式
2020/07/18 Javascript
工作中常用js功能汇总
2020/11/07 Javascript
js删除指定位置超链接中含有百度与360的标题
2021/01/06 Javascript
python时间整形转标准格式的示例分享
2014/02/14 Python
Python中的类与对象之描述符详解
2015/03/27 Python
Python爬取国外天气预报网站的方法
2015/07/10 Python
Python中使用gflags实例及原理解析
2019/12/13 Python
Python基于pygame实现单机版五子棋对战
2019/12/26 Python
解决Jupyter无法导入已安装的 module问题
2020/04/17 Python
pandas读取csv文件提示不存在的解决方法及原因分析
2020/04/21 Python
Python安装第三方库攻略(pip和Anaconda)
2020/10/15 Python
庆祝教师节活动方案
2014/01/31 职场文书
抗洪救灾感谢信
2015/01/22 职场文书
2015年12.4全国法制宣传日活动总结
2015/03/24 职场文书
童年读书笔记
2015/06/26 职场文书
二胎满月酒致辞
2015/07/29 职场文书
2016春季运动会开幕词
2016/03/04 职场文书
mysql配置SSL证书登录的实现
2021/09/04 MySQL
《总之就是很可爱》新作短篇动画《总之就是很可爱~制服~》将于2022年夏天播出
2022/04/07 日漫