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 相关文章推荐
在JavaScript中监听IME键盘输入事件
May 29 Javascript
jquery ajax对特殊字符进行转义防止js注入使用示例
Nov 21 Javascript
JS小游戏之宇宙战机源码详解
Sep 25 Javascript
JavaScript跨平台的开源框架NativeScript
Mar 24 Javascript
JavaScript基于DOM操作实现简单的数学运算功能示例
Jan 16 Javascript
self.attachevent is not a function的解决方法
Apr 04 Javascript
关于webpack2和模块打包的新手指南(小结)
Aug 07 Javascript
vue组件Prop传递数据的实现示例
Aug 17 Javascript
用 Vue.js 递归组件实现可折叠的树形菜单(demo)
Dec 25 Javascript
JavaScript如何处理移动端拍摄图片旋转问题
Nov 16 Javascript
Javascript实现鼠标移入方向感知
Jun 24 Javascript
小程序实现文字循环滚动动画
Jun 14 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的access操作类
2008/04/09 PHP
基于PHP实现的事件机制实例分析
2015/06/18 PHP
用PHP代码在网页上生成图片
2015/07/01 PHP
PHP缩略图生成和图片水印制作
2017/01/07 PHP
javascript event 事件解析
2011/01/31 Javascript
AJAX跨域请求json数据的实现方法
2013/11/11 Javascript
js中的eventType事件及其浏览器支持性介绍
2013/11/29 Javascript
使用原生js封装webapp滑动效果(惯性滑动、滑动回弹)
2014/05/06 Javascript
利用原生js和jQuery实现单选框的勾选和取消操作的方法
2016/09/04 Javascript
JS防止网页被嵌入iframe框架的方法分析
2016/09/13 Javascript
JS判断指定dom元素是否在屏幕内的方法实例
2017/01/23 Javascript
websocket+node.js实现实时聊天系统问题咨询
2017/05/17 Javascript
详解Vue 非父子组件通信方法(非Vuex)
2017/05/24 Javascript
Mac系统下Webstorm快捷键整理大全
2017/05/28 Javascript
浅谈webpack下的AOP式无侵入注入
2017/11/12 Javascript
常用的9个JavaScript图表库详解
2017/12/19 Javascript
layUI的验证码功能及校验实例
2019/10/25 Javascript
VUE DEMO之模拟登录个人中心页面之间数据传值实例
2019/10/31 Javascript
创建nuxt.js项目流程图解
2020/03/13 Javascript
vue cli3适配所有端方案的实现
2020/04/13 Javascript
小程序角标的添加及绑定购物车数量进行实时更新的实现代码
2020/12/07 Javascript
[01:02:18]VGJ.S vs infamous Supermajor 败者组 BO3 第一场 6.4
2018/06/05 DOTA
Python简单实现TCP包发送十六进制数据的方法
2016/04/16 Python
Python正则抓取新闻标题和链接的方法示例
2017/04/24 Python
Python实现的微信红包提醒功能示例
2019/08/22 Python
解决Pycharm中恢复被exclude的项目问题(pycharm source root)
2020/02/14 Python
利用PyQt5+Matplotlib 绘制静态/动态图的实现代码
2020/07/13 Python
利用Python实现最小二乘法与梯度下降算法
2021/02/21 Python
Html5踩坑记之mandMobile使用小记
2020/04/02 HTML / CSS
纽约通行卡:The New York Pass(免费游览纽约90多个景点)
2017/07/29 全球购物
物业经理求职自我评价
2013/09/22 职场文书
2015个人简历自我评价语
2015/03/11 职场文书
大学新生入学感想
2015/08/07 职场文书
诚信教育主题班会
2015/08/13 职场文书
PHP获取学生成绩的方法
2021/11/17 PHP
iSCSI服务器CHAP双向认证配置
2022/04/01 Servers