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 相关文章推荐
js实现图片在未加载完成前显示加载中字样
Sep 03 Javascript
jQuery插件Validate实现自定义表单验证
Jan 18 Javascript
JavaScript数组合并的多种方法
May 22 Javascript
基于JS代码实现实时显示系统时间
Jun 16 Javascript
基于JavaScript实现右键菜单和拖拽功能
Nov 28 Javascript
详解Javascript数据类型的转换规则
Dec 12 Javascript
BootstrapValidator实现注册校验和登录错误提示效果
Mar 10 Javascript
Vue.js实现模拟微信朋友圈开发demo
Apr 20 Javascript
Django+Vue.js搭建前后端分离项目的示例
Aug 07 Javascript
vue.js分页中单击页码更换页面内容的方法(配合spring springmvc)
Feb 10 Javascript
微信小程序自定义弹窗滚动与页面滚动冲突的解决方法
Jul 16 Javascript
taro小程序添加骨架屏的实现代码
Nov 15 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 cookis创建实现代码
2009/03/16 PHP
通过PHP CLI实现简单的数据库实时监控调度
2009/07/01 PHP
PHP中使用数组指针函数操作数组示例
2014/11/19 PHP
php+xml编程之SimpleXML的应用实例
2015/01/24 PHP
Zend Framework实现具有基本功能的留言本(附demo源码下载)
2016/03/22 PHP
PHP实现websocket通信的方法示例
2018/08/28 PHP
php伪静态验证码不显示的解决方案
2019/09/26 PHP
PHP查找一列有序数组是否包含某值的方法
2020/02/07 PHP
比较简单的异步加载JS文件的代码
2009/07/18 Javascript
兼容多浏览器的iframe自适应高度(ie8 、谷歌浏览器4.0和 firefox3.5.3)
2009/11/04 Javascript
通过jQuery打造支持汉字,拼音,英文快速定位查询的超级select插件
2010/06/18 Javascript
通过JavaScript使Div居中并随网页大小改变而改变
2013/06/24 Javascript
一个JS的日期格式化算法示例
2013/07/31 Javascript
Listloading.js移动端上拉下拉刷新组件
2016/08/04 Javascript
懒加载实现的分页&&网站footer自适应
2016/12/21 Javascript
jQuery实现多张图片上传预览(不经过后端处理)
2017/04/29 jQuery
vue.js整合mint-ui里的轮播图实例代码
2017/12/27 Javascript
vue中mint-ui的使用方法
2018/04/04 Javascript
js实现自定义滚动条的示例
2020/10/27 Javascript
[01:00:06]加油DOTA_EP01_网络版
2014/08/09 DOTA
[30:37]【全国守擂赛】第三周擂主赛 Dark Knight vs. Leopard Gaming
2020/05/04 DOTA
Python中的fileinput模块的简单实用示例
2015/07/09 Python
Linux中安装Python的交互式解释器IPython的教程
2016/06/13 Python
Python实现嵌套列表去重方法示例
2017/12/28 Python
Python提取频域特征知识点浅析
2019/03/04 Python
Python私有属性私有方法应用实例解析
2020/09/15 Python
CSS实现雨滴动画效果的实例代码
2019/10/08 HTML / CSS
HTML5 Canvas阴影使用方法实例演示
2013/08/02 HTML / CSS
事业单位请假制度
2014/01/13 职场文书
幼儿园托班开学寄语
2014/01/18 职场文书
精通CAD能手自荐书
2014/01/31 职场文书
员工培训邀请函
2014/02/02 职场文书
护士工作心得体会
2016/01/25 职场文书
JavaScript数组 几个常用方法总结
2021/11/11 Javascript
git中cherry-pick命令的使用教程
2022/06/25 Servers
怎么禁用Win11输入法 最新Win11输入法关闭教程
2022/08/05 数码科技