this的用法总结(java/js/flex)

17 篇文章 0 订阅
11 篇文章 0 订阅

  1. java中的this

    Java关键字this只能用于方法方法体内。当一个对象创建后,Java虚拟机(JVM)就会给这个对象分配一个引用自身的指针,这个指针的名字就是 this。因此,this只能在类中的非静态方法中使用,静态方法和静态的代码块中绝对不能出现this,这在“Java关键字static、final 使用总结”一文中给出了明确解释。并且this只和特定的对象关联,而不和类关联,同一个类的不同对象有不同的this。

     
    package test;
    public class ThisTest {
        private int i=0;
        //第一个构造器:有一个int型形参
        ThisTest(int i){
           this.i=i+1;//此时this表示引用成员变量i,而非函数参数i
           System.out.println("Int constructor i——this.i:  "+i+"——"+this.i);
           System.out.println("i-1:"+(i-1)+"this.i+1:"+(this.i+1));
           //从两个输出结果充分证明了i和this.i是不一样的!
        }
        //  第二个构造器:有一个String型形参
        ThisTest(String s){
           System.out.println("String constructor:  "+s);
        }
        //  第三个构造器:有一个int型形参和一个String型形参
        ThisTest(int i,String s){
           this(s);//this调用第二个构造器
           //this(i);
          
           this.i=i++;//this以引用该类的成员变量
           System.out.println("Int constructor:  "+i+"/n"+"String constructor:  "+s);
        }
        public ThisTest increment(){
           this.i++;
           return this;//返回的是当前的对象,该对象属于(ThisTest)
        }
        public static void main(String[] args){
           ThisTest tt0=new ThisTest(10);
           ThisTest tt1=new ThisTest("ok");
           ThisTest tt2=new ThisTest(20,"ok again!");
          
           System.out.println(tt0.increment().increment().increment().i);
           //tt0.increment()返回一个在tt0基础上i++的ThisTest对象,
           //接着又返回在上面返回的对象基础上i++的ThisTest对象!
        }
    }
     
    运行结果:
     
    Int constructor i——this.i:  10——11
    String constructor:  ok
    String constructor:  ok again!
    Int constructor:  21
    String constructor:  ok again!
    14
     
    细节问题注释已经写的比较清楚了,这里不在赘述,只是总结一下,其实this主要要三种用法:
    1、表示对当前对象的引用!
    2、表示用类的成员变量,而非函数参数,注意在函数参数和成员变量同名是进行区分!其实这是第一种用法的特例,比较常用,所以那出来强调一下。
    3、用于在构造方法中引用满足指定参数类型的构造器(其实也就是构造方法)。但是这里必须非常注意:只能引用一个构造方法且必须位于开始!
    还有就是注意:this不能用在static方法中!所以甚至有人给static方法的定义就是:没有this的方法!虽然夸张,但是却充分说明this不能在static方法中使用!


    说明在什么情况下需要用到this:
            第一、通过this调用另一个构造方法,用发是this(参数列表),这个仅仅在类的构造方法中,别的地方不能这么用。
            第二、函数参数或者函数中的局部变量和成员变量同名的情况下,成员变量被屏蔽,此时要访问成员变量则需要用“this.成员变量名”的方式来引用成员变量。当然,在没有同名的情况下,可以直接用成员变量的名字,而不用this,用了也不为错,呵呵。
            第三、在函数中,需要引用该函所属类的当前对象时候,直接用this。

            其实这些用法总结都是从对“this是指向对象本身的一个指针”这句话的更深入的理解而来的,死记不然容易忘记而且容易搞错,要理解!


    转载自:http://blog.sina.com.cn/s/blog_6a6badc90100t8hm.html


  2. flex中this:指调用方法的对象

    最近写flex代码时发现了一个相当不理解的问题,几经周折终于看明白问题所在,问题就在于我代码中的this关键字引起的,我在mxml文件中有如下代码

     

    [html]  view plain copy print ?
    1. <?xml version="1.0" encoding="utf-8"?>  
    2. <s:Group xmlns:fx="http://ns.adobe.com/mxml/2009"   
    3.          xmlns:s="library://ns.adobe.com/flex/spark"   
    4.          xmlns:mx="library://ns.adobe.com/flex/mx" width="400" height="300">  
    5.       
    6.     <fx:Script>  
    7.         <![CDATA[ 
    8.             import mx.controls.Alert; 
    9.             import mx.events.CloseEvent; 
    10.              
    11.             private var flade:Boolean = false; 
    12.             protected function image1_clickHandler(event:MouseEvent):void 
    13.             { 
    14.                 // TODO Auto-generated method stub 
    15.                 Alert.show("是否要修改个人信息?","提示信息",Alert.YES|Alert.NO,this,closeHandler); 
    16.                  
    17.                 function closeHandler(event:CloseEvent):void{ 
    18.                     if(event.detail == Alert.YES){ 
    19.                         //点击确定修改数据 
    20.                         this.flade = true; 
    21.                     }else{ 
    22.                         return; 
    23.                     } 
    24.                 } 
    25.             } 
    26.         ]]>  
    27.     </fx:Script>  
    28.       
    29.     <fx:Declarations>  
    30.         <!-- 将非可视元素(例如服务、值对象)放在此处 -->  
    31.     </fx:Declarations>  
    32.     <s:Image click="image1_clickHandler(event)"/>  
    33. </s:Group>  

    上面代码为我点击一个图片的click事件,点击后问题出现了,this.flade = true;中的变量居然不是代表我定义的那个变量,神奇吧,回去看了一下脚本语言的相关知识发现,this关键字代表的是调用这个方法的对象(上面的代码中的this代表的Alert而不是我的mxml)。去掉this问题解决。

    转载自:http://blog.csdn.net/wozaifeiyang0/article/details/7187897


  3. javascript中的this

    在JavaScript中this变量是一个令人难以摸清的关键字,this可谓是非常强大,充分了解this的相关知识有助于我们在编写面向对象的JavaScript程序时能够游刃有余。

    对于this变量最要的是能够理清this所引用的对象到底是哪一个,也许很多资料上都有自己的解释,但有些概念讲的偏繁杂。而我的理解是:首先分析this所在的函数是当做哪个对象的方法调用的,则该对象就是this所引用的对象

     

    示例一、

    var obj = {};

    obj.x = 100;

    obj.y = function(){ alert( this.x ); };

    obj.y();    //弹出 100

     

    这段代码非常容易理解,当执行 obj.y() 时,函数是作为对象obj的方法调用的,因此函数体内的this指向的是obj对象,所以会弹出100。

     

    示例二、

    var checkThis = function(){

        alert( this.x); 

    };

    var x = 'this is a property of window';

    var obj = {};

    obj.x = 100;

    obj.y = function(){ alert( this.x ); };

    obj.y();    //弹出 100

    checkThis();    //弹出 'this is a property of window'

    这里为什么会弹出 'this is a property of window',可能有些让人迷惑。在JavaScript的变量作用域里有一条规则“全局变量都是window对象的属性”。当执行 checkThis() 时相当于 window.checkThis(),因此,此时checkThis函数体内的this关键字的指向变成了window对象,而又因为window对象又一个x属性('this is a property of window'),所以会弹出 'this is a property of window'。

     

    上面的两个示例都是比较容易理解的,因为只要判断出当前函数是作为哪个对象的方法调用(被哪个对象调用)的,就可以很容易的判断出当前this变量的指向。

     

    this.x 与 apply()、call()

    通过call和apply可以重新定义函数的执行环境,即this的指向,这对于一些应用当中是十分常用的。

    示例三:call()

     

    function changeStyle( type , value ){

        this.style[ type ] = value;

    }

    var one = document.getElementByIdx( 'one' ); 

    changeStyle.call( one , 'fontSize' , '100px' );

    changeStyle('fontSize' , '300px');  //出现错误,因为此时changeStyle中this引用的是window对象,而window并无style属性。

    注意changeStyle.call()中有三个参数,第一个参数用于指定该函数将被哪个对象所调用。这里指定了one,也就意味着,changeStyle函数将被one调用,因此函数体内this指向是one对象。而第二个和第三个参数对应的是changeStyle函数里的type和value两个形参。最总我们看到的效果是Dom元素one的字体变成了20px。

    示例四:apply()

     

     

    function changeStyle( type , value ){

        this.style[ type ] = value;

    }

    var one = document.getElementByIdx( 'one' ); 

    changeStyle.apply( one , ['fontSize' , '100px' ]);

    changeStyle('fontSize' , '300px');  //出现错误,原因同示例三

     

    apply的用法和call大致相同,只有一点区别,apply只接受两个参数,第一个参数和call相同,第二个参数必须是一个数组,数组中的元素对应的就是函数的形参。

     

    无意义(诡异)的this用处

    示例五:

    var obj = {

        x : 100,

        y : function(){

            setTimeout(

                function(){ alert(this.x); }    //这里的this指向的是window对象,并不是我们期待的obj,所以会弹出undefined

             , 2000);

        }

    };

    obj.y();

    如何达到预期的效果

    var obj = {

        x : 100,

        y : function(){

            var that = this;

            setTimeout(

                function(){ alert(that.x); }

             , 2000);

        }

    };

    obj.y();    //弹出100

     

    事件监听函数中的this

    var one = document.getElementByIdx( 'one' );

    one.onclick = function(){

        alert( this.innerHTML );    //this指向的是one元素,这点十分简单..

    };

    转载自:http://blog.csdn.net/xiaoyong322/article/details/7313028



  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值