this指向
以前不太理解面向对象的this指向问题,今天自己看着视频教程,加自己学了2个例子,终于明白点了。
我们在写对象程序的时候,我们希望保持this始终是指向对象的,但事实确常常事与愿违。
正常情况this的指向都没问题,比如下面

1 //构造函数
2 function createPerson(name,age){
3 this.name=name;
4 this.age=age;
5 this.showName();
6 }
7 //原型方法
8 createPerson.prototype.showName=function(){
9 console.log('我的名字是:'+this.name+'我的年纪是:'+this.age);
10 }
11 //调用结果为 我的名字是:程序员我的年纪是:27
12 new createPerson('程序员','27');
13
14 //可以看到这里的this始终指向 createPerson对象

但工作的写代码不会那么简单alert一个值,常常会加入事件等等,这时候this的指向是怎样的呢?还会指向对象么?看下面

1 function tabSwitch(id){
2 this.oDiv=document.getElementById(id);
3 this.btn=this.oDiv.getElementsByTagName('input');
4 this.div=this.oDiv.getElementsByTagName('div');
5 }
6 tabSwitch.prototype.tab=function(){
7 for(var i=0;i<this.btn.length;i++){
8 this.btn[i].index=i;
9 this.btn[i].onclick=function(){
10 alert(this);//object HTMLInputElement
11 }
12
13 }
14 }

看到了么this,变成了html的一个节点,这时候再继续写下边的代码,肯定就错了。这时候我需要改下this的指向,让this重新指向对象。继续

1 function tabSwitch(id){
2 this.oDiv=document.getElementById(id);
3 this.btn=this.oDiv.getElementsByTagName('input');
4 this.div=this.oDiv.getElementsByTagName('div');
5 }
6 tabSwitch.prototype.tab=function(){
7 //把对象中的this存下来赋值为_this
8 var _this=this;
9 for(var i=0;i<this.btn.length;i++){
10 this.btn[i].index=i;
11 this.btn[i].onclick=function(){
12 alert(_this);//object
13 }
14
15 }
16 }

用_this变量缓存指向对象的this就可以在正确的地方 用到正确的指向。(有点绕晕了)
最后上一个今天尝试些的复杂一点点的例子:左右点击按钮滑动切换ul

1 function slideMove(moveUl,arrowLeft,arrowRight,marginRight){
2 this.moveUl=$('#'+moveUl);
3 this.liLength=$('#'+moveUl).find('li').length;
4 this.liWidth=$('#'+moveUl+'>li').eq(0).innerWidth()+marginRight;
5 this.arrowLeft=$('#'+arrowLeft);
6 this.arrowRight=$('#'+arrowRight);
7 this.path=0;
8 this.moveUl.css('width',this.liWidth*this.liLength);
9 this.init();//初始化
10 }
11 slideMove.prototype.init=function(){
12 var _this=this;//对象
13 this.arrowLeft.on('click',function(){
14 _this.clickLeft();
15 });
16 this.arrowRight.on('click',function(){
17 _this.clickRight();
18 });
19 }
20 slideMove.prototype.clickLeft=function(){
21
22 console.log(this.path)
23 //到左边了return掉
24 if(this.path<=0){
25 this.path=0;
26 return false;
27 }
28 this.path--;
29 this.moveUl.stop().animate({'left':-this.path*this.liWidth});
30 }
31 slideMove.prototype.clickRight=function(){
32
33 console.log(this.path)
34 //到了右边return掉
35 if(this.path>=this.liLength-4){
36 this.path=this.liLength-3;
37 return false;
38 }
39 this.path++;
40 this.moveUl.stop().animate({'left':-this.path*this.liWidth});
41 }
42 //调用
43 var slide1=new slideMove('moban_ul1','arrow_left1','arrow_right1',22);
this指向的更多相关文章
- C语言中 指向函数的指针 简介
引子:在学习CPrimerPlus的第十四章的14.13节中,遇到了如下三行文字,是有关指向函数的指针的,把我搞晕了. char * fump(); //返回指向char的指针的函数 char (* ...
- JS this指向
正常模式 在正常模式下独立函数的的 this 指向 undefined 或 window. <script type="text/javascript"> functi ...
- java多态性,父类引用指向子类对象
父类引用指向子类对象指的是: 例如父类Animal,子类Cat,Dog.其中Animal可以是类也可以是接口,Cat和Dog是继承或实现Animal的子类. Animal animal = new C ...
- 【javascript 技巧】谈谈setTimeout的作用域以及this的指向问题
setTimeout的用法详见:http://www.w3school.com.cn/htmldom/met_win_settimeout.asp 是的,setTimeout的常见用法是让某个方法延迟 ...
- what's this? 浅谈js中this的指向问题
刚刚学习js的朋友可能和我一样,看到代码中的this总是一脸懵逼,不知道this到底指向谁.经过一段时间的了解,我想跟大家分享下自己的理解. 何时出现this 函数在调用的时候,会自动获得两个特殊变量 ...
- EC笔记,第二部分:10.让=返回指向*this的引用
Effective C++ 学习笔记 10 让=返回指向*this的引用 Table of Contents 1. 原因 2. 建议:在没有充分理由标新立异前,最好的做法是遵从传统. –by SkyF ...
- JavaScript中this指针指向的彻底理解
this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象 这一点与函数中自由变量Action-varibal不同 var ...
- JavaScript中this指向的简单理解
首先必须要说的是,this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象(这句话有些问题,后面会解释为什么会有问题,虽然 ...
- 12-返回指针的函数&&指向函数的指针
前言 接下来我只讲指针的最常见用法,比如这一章的内容----返回指针的函数 与 指向函数的指针 一.返回指针的函数 指针也是C语言中的一种数据类型,因此一个函数的返回值肯定可以是指针类型的. 返回 ...
- 彻底理解js中this的指向,不必硬背。
首先必须要说的是,this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象(这句话有些问题,后面会解释为什么会有问题,虽然 ...
随机推荐
- Linux下怎么删除非空目录
rm -rf 目录名 解释: 1.r意思是删除目录,f意思是force的缩写,强制删除,不提示. 2.如果目录为空,可以用 "rmdir 目录名"删除. 3.如果目录不为空,可以用 ...
- ADSafe净网大师----所谓的去广告神器竟然在偷偷推送广告
今天刚开发完的网站上线联调, 偶然发现<head>里多了一个脚本引用: <script async src="http://c.cnzz.com/core.php" ...
- Ubuntu Server 安装桌面untiy
1.安装 sudo apt-get install ubuntu-desktop sudo apt-get install unity sudo apt-get install unity-commo ...
- Codility Tree Height
public class HeightOfTreeSolution { static int height=-1; public int solution(Tree T) { // write you ...
- 比CMD更强大的命令行WMIC
先决条件:a. 启动Windows Management Instrumentation服务,开放TCP135端口.b. 本地安全策略的“网络访问: 本地帐户的共享和安全模式”应设为“经典-本地用户以 ...
- YY前端课程3
1. 常用的字符实体(html实体):空格= <=< >=> 版权符号=© 2. ID就像身份证号一样,是唯一的,html页面的ID不能重复: ...
- SWM格式稀疏权重矩阵转换为方阵形式全过程分享
在进行空间统计实验过程中,经常涉及到空间权重矩阵的处理,有时候需要将ArcGIS生成的swm格式的权重矩阵转换为形如“0 1”的方阵格式.这里将我的办法整理出来. 1.用如下工具箱生成swm格式的权重 ...
- spring+mybatis+springmvc的配置
1.web.xml的配置 <?xml version="1.0" encoding="UTF-8"?><web-app version=&qu ...
- js对特殊字符转义、时间格式化、获取URL参数
/*特殊字符转义*/ function replace_html(str) { var str = str.toString().replace(/&/g, "&" ...
- <java基础学习>02JAVA的基础组成(2)
60000-0000 0000-0000 0000-0000 0000-0110 0000-0110 -6这个数的正数的二进制取反,再加1 0000-0110取反: 1111-1001 + 0000- ...