以前不太理解面向对象的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指向的更多相关文章

  1. C语言中 指向函数的指针 简介

    引子:在学习CPrimerPlus的第十四章的14.13节中,遇到了如下三行文字,是有关指向函数的指针的,把我搞晕了. char * fump(); //返回指向char的指针的函数 char (* ...

  2. JS this指向

    正常模式 在正常模式下独立函数的的 this 指向 undefined 或 window. <script type="text/javascript"> functi ...

  3. java多态性,父类引用指向子类对象

    父类引用指向子类对象指的是: 例如父类Animal,子类Cat,Dog.其中Animal可以是类也可以是接口,Cat和Dog是继承或实现Animal的子类. Animal animal = new C ...

  4. 【javascript 技巧】谈谈setTimeout的作用域以及this的指向问题

    setTimeout的用法详见:http://www.w3school.com.cn/htmldom/met_win_settimeout.asp 是的,setTimeout的常见用法是让某个方法延迟 ...

  5. what's this? 浅谈js中this的指向问题

    刚刚学习js的朋友可能和我一样,看到代码中的this总是一脸懵逼,不知道this到底指向谁.经过一段时间的了解,我想跟大家分享下自己的理解. 何时出现this 函数在调用的时候,会自动获得两个特殊变量 ...

  6. EC笔记,第二部分:10.让=返回指向*this的引用

    Effective C++ 学习笔记 10 让=返回指向*this的引用 Table of Contents 1. 原因 2. 建议:在没有充分理由标新立异前,最好的做法是遵从传统. –by SkyF ...

  7. JavaScript中this指针指向的彻底理解

    this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象 这一点与函数中自由变量Action-varibal不同 var ...

  8. JavaScript中this指向的简单理解

    首先必须要说的是,this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象(这句话有些问题,后面会解释为什么会有问题,虽然 ...

  9. 12-返回指针的函数&&指向函数的指针

    前言 接下来我只讲指针的最常见用法,比如这一章的内容----返回指针的函数 与 指向函数的指针   一.返回指针的函数 指针也是C语言中的一种数据类型,因此一个函数的返回值肯定可以是指针类型的. 返回 ...

  10. 彻底理解js中this的指向,不必硬背。

    首先必须要说的是,this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象(这句话有些问题,后面会解释为什么会有问题,虽然 ...

随机推荐

  1. pyhon——进程线程、与协程基础概述

    一直以来写博客都是实用主义者,只写用法,没信心写原理,但是每一次写作业的过程都有一种掘地三尺的感觉,终于,写博客困难症重症患者经历了漫长的思想斗争,还是决定把从网上淘到的各种杂货和自己的总结放在一起, ...

  2. jquery trigger 触发事件小计 -- 关于a标签

    jquery -- trigger触发执行事件方法虽然好用,偶尔也会出些小问题. 在最近得一个项目中需要触发a标签的点击事件时,我就遇到了点小问题.我很想当然的写层这样:$("a" ...

  3. PHP之PhpDocument的使用

    参考资料: 1.http://manual.phpdoc.org/HTMLSmartyConverter/HandS/ric_INSTALL.html 2.http://blog.csdn.net/s ...

  4. Asp.net MVC过滤器的使用

    当我们网站开发到这里的时候,我们虽然已经实现了用户登录信息,用户不经过登录信息,比如:http://localhost:6941/UserInfo/Index如果我这样访问的话,他是可以进行操作的,所 ...

  5. Windows 10系统更换Windows 7系统磁盘分区注意事项二

    1.在原WIN10系统中将硬盘的GPT分区表格式转换为MBR分区表格式 上一篇关于新机预装WIN10系统更换为WIN7系统中说到需要将硬盘的GPT分区表格式转换为MBR分区表格式,在文章末尾给出的链接 ...

  6. 苹果下如果安装nginx,给nginx安装markdown第三方插件

    用brew install nginx 这样安装的是最新版的nginx, 但是在有些情况下,安装第三方插件需要特定的版本,更高一级的版本可能装不上. 它的原理是下载安装包进行自动安装,建立软链,这样就 ...

  7. UITableViewCell 顶格

    首先在ViewDidLoad 或者ViewWillAppear里边写 if ([_tabView respondsToSelector:@selector(setSeparatorInset:)]) ...

  8. java selenium (十三) 智能等待页面加载完成

    我们经常会碰到用selenium操作页面上某个元素的时候, 需要等待页面加载完成后, 才能操作.  否则页面上的元素不存在,会抛出异常. 或者碰到AJAX异步加载,我们需要等待元素加载完成后, 才能操 ...

  9. FZU 2150 Fire Game

    Fire Game Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit St ...

  10. 【转】responseText,responseBody,responseXML差别

    为了做ajax的代理,研究了下服务器端的xmlhttp和客户端ajax中的xmlhttp,做了个比较 由于我一直使用JavaScript作为Asp的教本语言,所以比较起来更清楚.服务器端的xmlhtt ...