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的最终指向的是那个调用它的对象(这句话有些问题,后面会解释为什么会有问题,虽然 ...
随机推荐
- js点击按钮div显示,点击div或者body和按钮,div隐藏
var box = document.getElementById("box"); var btn = document.getElementById("btn" ...
- the usage of map.put
这个不用要的那么详细,对于应用来说,比如举个例子: Map map = new HashMap();map.put("key","value");这样就存入了一 ...
- 通过php下载文件并重命名
$filename = dirname(__FILE__) . '/oldfilename.jpg'; $out_filename = 'newfilename.jpg'; if( ! file_ex ...
- img标签 加载FTP的图片 C#
好吧,我是菜鸟,这是我今天遇到的问题,什么也不会,得高人指点 1.使用FtpWebRequest下载图片,以流存贮 2.在ashx文件里面直接已流方式(HttpContext.Current.Resp ...
- PDF 补丁丁 0.5.0.2657 发布
新版本修正了导出图片时由于路径存在空白导致出错.在 Windows 10 和高分辨率显示屏上显示字体模糊.控件尺寸错位等各种问题. 默认显示工具栏.
- Msbuild项目集成右键菜单编译
DS1.背景: 我们为什么要将VS2008命令行编译.sln文件集成到右键菜单呢? 原因一:VS2008很好很强大,但太费系统资源了,尤其是在虚拟机在里面装VS2008的时候更是如此. 原因二:有 ...
- 手把手教你使用PS切图
http://blog.csdn.net/jiangwei0910410003/article/details/41627565
- IHttpHandler给图片加水印
/// <summary> /// WaterMarkHandlher 的摘要说明 /// </summary> public class WaterMarkHandlher ...
- 100. Same Tree
[题目] Given two binary trees, write a function to check if they are equal or not. Two binary trees ar ...
- http调接口
private static String doGetResult(String urlStr, Map<String, String> params) throws Exception ...