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 相关文章推荐
Convert Seconds To Hours
Jun 16 Javascript
基于Jquery的简单&简陋Tabs插件代码
Feb 09 Javascript
js下写一个事件队列操作函数
Jul 19 Javascript
5秒后跳转效果(setInterval/SetTimeOut)
May 03 Javascript
javascript实用小函数使用介绍
Nov 11 Javascript
jquery append()方法与html()方法的区别及使用介绍
Aug 01 Javascript
JavaScript设计模式初探
Jan 07 Javascript
sea.js常用的api简易文档
Nov 15 Javascript
禁止弹窗中蒙层底部页面跟随滚动的几种方法
Dec 07 Javascript
在小程序/mpvue中使用flyio发起网络请求的方法
Sep 13 Javascript
小程序使用watch监听数据变化的方法详解
Sep 20 Javascript
Vue组件化(ref,props, mixin,.插件)详解
May 15 Vue.js
原生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
PHP5.0对象模型探索之抽象方法和抽象类
2006/09/05 PHP
php采集自中央气象台范围覆盖全国的天气预报代码实例
2015/01/04 PHP
PHP7扩展开发之hello word实现方法详解
2018/01/15 PHP
Javascript new关键字的玄机 以及其它
2010/08/25 Javascript
jquery点击页面任何区域实现鼠标焦点十字效果
2013/06/21 Javascript
js单独获取一个checkbox看其是否被选中
2014/09/22 Javascript
js与jquery回车提交的方法
2015/02/03 Javascript
jquery实现动态操作select选中
2015/02/11 Javascript
JS清除文本框内容离开在恢复及鼠标离开文本框时触发js的方法
2016/01/12 Javascript
jQuery Mobile框架中的表单组件基础使用教程
2016/05/17 Javascript
浅谈js中的延迟执行和定时执行
2016/05/31 Javascript
js仿微信语音播放实现思路
2016/12/12 Javascript
js移动端图片压缩上传功能
2020/08/18 Javascript
基于vue2.x的电商图片放大镜插件的使用
2018/01/22 Javascript
微信小程序通过保存图片分享到朋友圈功能
2018/05/24 Javascript
vue+php实现的微博留言功能示例
2019/03/16 Javascript
AI小程序之语音听写来了,十分钟掌握百度大脑语音听写全攻略
2020/03/13 Javascript
js实现简单音乐播放器
2020/06/30 Javascript
vue+axios全局添加请求头和参数操作
2020/07/24 Javascript
vue接通后端api以及部署到服务器操作
2020/08/13 Javascript
vue路由分文件拆分管理详解
2020/08/13 Javascript
[01:05:52]DOTA2-DPC中国联赛 正赛 Ehome vs Aster BO3 第一场 2月2日
2021/03/11 DOTA
详解Python中dict与set的使用
2015/08/10 Python
python 自动批量打开网页的示例
2019/02/21 Python
python 实现目录复制的三种小结
2019/12/04 Python
Python网页解析器使用实例详解
2020/05/30 Python
Cpython解释器中的GIL全局解释器锁
2020/11/09 Python
CSS3制作漂亮的照片墙的实现代码
2016/06/08 HTML / CSS
你经历的项目中的SCM配置项主要有哪些?什么是配置项?
2013/11/04 面试题
财务学生的职业生涯发展
2014/02/11 职场文书
机械制造专业毕业生求职信
2014/03/02 职场文书
学校读书活动总结
2014/06/30 职场文书
市场部岗位职责
2015/02/12 职场文书
个人求职信格式范文
2015/03/20 职场文书
社区党支部公开承诺书
2015/04/29 职场文书
校园安全主题班会
2015/08/12 职场文书