面向对象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);
时间: 2024-12-27 00:35:15

面向对象this指向的相关文章

面向对象--多继承&amp;派生类对象内存布局分析&amp;各基类指针所指向的位置分析

背景 原文链接:ordeder  http://blog.csdn.net/ordeder/article/details/25477363 关于非虚函数的成员函数的调用机制,可以参考: http://blog.csdn.net/yuanyirui/article/details/4594805 成员函数的调用涉及到面向对象语言的反射机制. 虚函数表机制可以查看下面这个blog: http://blog.csdn.net/haoel/article/details/1948051 总结为: 其一

JavaScript面向对象(一)——JS OOP基础与JS 中This指向详解

  前  言 JRedu 学过程序语言的都知道,我们的程序语言进化是从"面向机器".到"面向过程".再到"面向对象"一步步的发展而来.类似于汇编语言这样的面向机器的语言,随着时代的发展已经逐渐淘汰:而面向过程的语言也只有C语言老大哥依然坚挺:现在主流的语言(例如Java.C++.PHP等)都是面向对象的语言. 而我们的JavaScript语言,恰恰介于面向过程与面向对象之间,我们称它为"基于对象"的语言.但是,JS中的OOP依

对象 this 指向 面向对象

一.对象,this指向,面向对象(工具) var obj = { }; var obj2 = new Object( ); function Foo(){} var obj3 = new Foo() 对象的生命模式 1.对象的功能:对象的功能就是用来存数据的:因为对象可储存结构非常复杂的数据; 案例 存成绩单 var str = "杨怀智 : 40"; var str2 = "史菲 :100": 映射 复杂映射 var arr = [0,1,2,3,4,5,6,7]

面向对象JS ES5/ES6 类的书写 继承的实现 new关键字执行 this指向 原型链

一 .什么是面向对象? 面向对象(Object Oriented),简写OO,是一种软件开发方法. 面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物. 面向对象的概念和应用已超越了程序设计和软件开发,扩展到如数据库系统.交互式界面.应用结构.应用平台.分布式系统.网络管理结构.CAD技术.人工智能等领域. 面向对象是相对于面向过程来讲的,面向对象方法,把相关的数据和方法组织为一个整体来看待,从更高的层次来进行系统建模,更贴近事物的自然运行模式. 编程范式 一般可以

面向对象之父类变量指向子类实例对象分析

父类 public class person { public static string markup; static person() { markup = "markup"; } //无参数构造函数 //public person() //{ // Console.WriteLine("调用person构造函数"); //} public person(int parage, string paraname, string parahobby) { age =

父类引用指向子类对象--面向对象的多态

先上代码 package com.fuzi.demo; public class FuZi { public static void main(String[] args) { FuLei fuLei = new ZiLei(); fuLei.print_info(); } } class FuLei { public void print_info() { System.out.println("父类的print_info"); System.out.println(this.get

面向对象编程

面向对象:类,属性,方法 面向对象最重要的概念就是类(Class)和实例(Instance),必须牢记类是抽象的模板,比如Student类,而实例是根据类创建出来的一个个具体的"对象",每个对象都拥有相同的方法,但各自的数据可能不同. 仍以Student类为例,在Python中,定义类是通过class关键字: class Student(object): pass class后面紧接着是类名,即Student,类名通常是大写开头的单词,紧接着是(object),表示该类是从哪个类继承下

java面向对象

Java语言完全支持面向对象的继承.封装.多态,纯粹的面向对象的程序设计语言.Java以对象为中心,整个程序由类(Java的最小的程序单位)组成.Java是一个静态语言,一个类完成定义后,只要不重新编译,则类和其对象的方法和属性是固定的.Java引入了包的机制,提供类的多层命名空间,用于解决类命名冲突,类文件管理.一旦在源文件中使用了package packageName,则意味着该源文件里的所有类都属于这个包,完整类名为包名+类名.java的包机制需要源文件里的package指定包名还需要cl

面向对象之对象,作用域及this

object eg: var o = { a : 2, b : 3 }; console.log(o); console.log(typeof o); console.log(o.a.toFixed(2)); ==> var o = new Object(); o.a = 2; o.b = 3; console.log(o); console.log(typeof o); console.log(o.a.toFixed(2)); eg: var person = { name: “张三”, ag