JavaScript中的this关键字

js中的this关键字和其他的面向对象语言中的this是不同的。

下面通过对java中this关键字和js中的this关键字的内存分析来说明他们之间的不同


一.内存分析


1.   java中this关键字


this指的是当前对象(对象自身的引用)

        

this为什么存在于堆中?

this关键字在方法内部使用,表示对“调用方法的那个对象”的引用。所以既然this方法只能在方法内部使用,那么他表示的就是一个局部的含义,相当于一个局部变量。而局部变量是存放在内存中的栈中的,当那个方法执行完,this就消失了!但是与局部变量不同的是,在同一个类里面,每个方法里面都存在this!this就相当于对象的一个属性了,不管我们使用还是不使用,他总是存在的! 这也是this存在堆中的原因!


2.      Js中this关键字


关键字 this 指向调用该方法的对象;用在对象的方法中。使用 this即可在任何多个地方重用同一个函数。

           

正如上图所示:thisJavascript语言的一个关键字它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用

经过和上面的对比可以得出一个结论,js中的this依存于方法只有当方法被调用的时候this才会起作用来决定指向的是谁!而java中的this却可以看成是对象自己的一个属性不依赖于方法,只要对象存在this就存在


二.Js中this的使用


Js中 this总是指向调用该方法的对象,那么就从方法为切入点来分析this的使用


1.      在window中定义function中使用this关键字


<script type="text/javascript">
    //在window上创建一个对象
    var Obj = {};
    //在window上创建一个function
    function Method(){
        //查看this代表的是哪个对象
        alert((this == window)+','+(this == Obj ));
    }
    //将在window中定义的function-Method赋值给Obj的Method属性
    Obj.Method = Method;
    //直接调用Method
    Method ();//执行的结果:true,false
    //通过Obj调用Method
    Obj.Method ();//执行的结果:false,true
</script>

这种定义方法调用方式有两种,他们的调用方式都能找到相应内存中的function- Method(有名方法),并执行。
但是执行结果却不同原因就是:方法由谁调用,则this表示谁。

一种是直接调用

Method()的调用者是window.

对window有所理解的人应该知道,Javascript页面级的作用域为window,即缺省有名对象都相当于window的一个属性,如定义var a;相当于指定window.a属性,定义function b同样相当于指定window.b属性。所以Method()的调用相当于window.Method()调用,调用者为window,所以this==window返回true;


一种是通过对象调用

Obj.Method()调用者为Obj,所以this==Obj返回true;


2.      在一个对象中定义一个公有属性和方法中使用this关键字



<script type="text/javascript">
    //创建两个空对象   
    var obj1=new Object();   
    var obj2=new Object();  
    
    //给两个对象都添加属性p,并分别等于1和2   
    obj1.p=1;   
    obj2.p=2;   
    
    //给obj1添加方法,用于显示p的值   
    obj1.getP=function(){   
           alert(this.p); //表面上this指针指向的是obj1   
    }   
    
    //调用obj1的getP方法   
    obj1.getP();   //运行结果:1
    
    //使obj2的getP方法等于obj1的getP方法    
    obj2.getP=obj1.getP;  
    //调用obj2的getP方法   
    obj2.getP();   //运行结果是:2
    
    getP();//运行提示为定义(说明定义在对象中不能够直接调用,必须通过对象调用)
    
</script>

这种定义方式只有一种调用方式,通过对象调用;

但是getP函数仅定义了一次,在不同的场合运行,显示了不同的运行结果,这是有this指针的变化所决定的。

Jsthis处理机制:方法由谁调用,则this表示谁。

obj1getP方法中,obj1调用了此方法那么this就指向了obj1对象;

obj2getP方法中,obj2调用了此方法那么this就指向了obj2对象;并通过this指针引用到了两个对象都具有的属性p。

this指针的性质,也可以更好的理解JavaScript中对象的本质:一个对象就是由一个或多个属性(方法)组成的集合。每个集合元素不是仅能属于一个集合,而是可以动态的属于多个集合。这样,一个方法(集合元素)由谁调用,this指针就指向谁。


3.      在构造函数中使用this关键字


<script type="text/javascript">

    //创建对象,并且在构造函数中使用this关键字
    function test(){ 
    this.x = 1; 
  } 
  var o = new test();     //实例化一个对象
  alert(o.x); // 运行结果是:1 

</script>

做一个修改来表明在构造函数中使用的this不是全局对象


<script type="text/javascript">

    //在window上直接定义了一个x变量,并且设置了初始值
    var x = 2; 
  function test(){ 
    this.x = 1; 
  } 
  var o = new test(); 
  //不是调用o对象的x而是直接调用x
  alert(x);   //运行结果是:2 
    alert(o.x); //运行结果是:1    
</script>



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值