JavaScript中的this指针用法

来源:站长网 时间:2007-08-26 17:29:00 

this指针是面向对象程序设计中的一项重要概念,它表示当前运行的对象。在实现对象的方法时,可以使用this指针来获得该对象自身的引用。

  和其他面向对象的语言不同,JavaScript中的this指针是一个动态的变量,一个方法内的this指针并不是始终指向定义该方法的对象的,在上一节讲函数的apply和call方法时已经有过这样的例子。为了方便理解,再来看下面的例子:

<script language="JavaScript" 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();  
//使obj2的getP方法等于obj1的getP方法  
obj2.getP=obj1.getP;  
//调用obj2的getP方法  
obj2.getP();  
//-->  
</script>

  从代码的执行结果看,分别弹出对话框显示1和2。由此可见,getP函数仅定义了一次,在不同的场合运行,显示了不同的运行结果,这是有this指针的变化所决定的。在obj1的getP方法中,this就指向了obj1对象,而在obj2的getP方法中,this就指向了obj2对象,并通过this指针引用到了两个对象都具有的属性p。


  由此可见,JavaScript中的this指针是一个动态变化的变量,它表明了当前运行该函数的对象。由this指针的性质,也可以更好的理解JavaScript中对象的本质:一个对象就是由一个或多个属性(方法)组成的集合。每个集合元素不是仅能属于一个集合,而是可以动态的属于多个集合。这样,一个方法(集合元素)由谁调用,this指针就指向谁。实际上,前面介绍的apply方法和call方法都是通过强制改变this指针的值来实现的,使this指针指向参数所指定的对象,从而达到将一个对象的方法作为另一个对象的方法运行。

  每个对象集合的元素(即属性或方法)也是一个独立的部分,全局函数和作为一个对象方法定义的函数之间没有任何区别,因为可以把全局函数和变量看作为window对象的方法和属性。也可以使用new操作符来操作一个对象的方法来返回一个对象,这样一个对象的方法也就可以定义为类的形式,其中的this指针则会指向新创建的对象。在后面可以看到,这时对象名可以起到一个命名空间的作用,这是使用JavaScript进行面向对象程序设计的一个技巧。例如:

代码片段


var namespace1=new Object();  
namespace1.class1=function(){  
     //初始化对象的代码  
}  
var obj1=new namespace1.class1();  


  这里就可以把namespace1看成一个命名空间。 


  由于对象属性(方法)的动态变化特性,一个对象的两个属性(方法)之间的互相引用,必须要通过this指针,而其他语言中,this关键字是可以省略的。如上面的例子中: 


obj1.getP=function(){  
      alert(this.p); //表面上this指针指向的是obj1  
}


  这里的this关键字是不可省略的,即不能写成alert(p)的形式。这将使得getP函数去引用上下文环境中的p变量,而不是obj1的属性。

标签:this,JavaScript
0
投稿

猜你喜欢

  • ASP 关于动态数据显示页面得锚点

    2007-11-04 20:28:00
  • JavaScript版的DateAdd、DateDiff、IsDate函数

    2008-01-30 15:35:00
  • windows系统下让mysql支持federated的storage engine

    2010-01-20 11:16:00
  • Access 2002的三个实用技巧

    2007-10-22 12:22:00
  • 页面自动刷新javascript代码大全

    2010-06-28 18:54:00
  • asp导出CSV格式数据

    2008-12-24 21:25:00
  • 从MySQL4.0向MySQL5迁移数据

    2007-11-19 13:11:00
  • 如何用拦截表单的方法上传图片?

    2010-06-16 09:50:00
  • 修改、删除数据记录(DELETE\\UPDATE)

    2009-02-27 15:50:00
  • 网站中文字的视觉设计

    2008-04-16 13:35:00
  • Html的几个小技巧

    2011-04-29 14:02:00
  • CSS改变字体而不影响网页

    2010-10-20 20:11:00
  • xWin的HTC分享

    2009-09-13 18:50:00
  • Dreamweaver使用疑难解答

    2009-09-13 18:41:00
  • 使用 XSLT 解释 XML 文件

    2009-03-08 19:06:00
  • Oracle的默认用户密码

    2012-07-11 15:29:22
  • 微软证实最新的关键SQL Server漏洞

    2008-12-23 13:31:00
  • 如何在Win下mysql备份恢复命令

    2010-03-03 17:23:00
  • 动态载入树 (ASP+数据库)

    2010-05-27 12:20:00
  • FireScope-面向Web开发者和设计者的参考手册

    2009-03-22 15:35:00
  • asp之家 网络编程 m.aspxhome.com