[轉(zhuǎn)載于 http://www.aspxhome.com/javascript/start/20078/148126.htm,并做了少量修改]
this指針是面向?qū)ο蟪绦蛟O(shè)計(jì)中的一項(xiàng)重要概念,它表示當(dāng)前運(yùn)行的對(duì)象。在實(shí)現(xiàn)對(duì)象的方法時(shí),可以使用this指針來獲得該對(duì)象自身的引用。
和其他面向?qū)ο蟮恼Z言不同,JavaScript中的this指針是一個(gè)動(dòng)態(tài)的變量,一個(gè)方法內(nèi)的this指針并不是始終指向定義該方法的對(duì)象的,在上一節(jié)講函數(shù)的apply和call方法時(shí)已經(jīng)有過這樣的例子。為了方便理解,再來看下面的例子:
<script language="JavaScript" type="text/javascript">
<!--
//創(chuàng)建兩個(gè)空對(duì)象
var obj1=new Object();
var obj2=new Object();
//給兩個(gè)對(duì)象都添加屬性p,并分別等于1和2
obj1.p=1;
obj2.p=2;
//給obj1添加方法,用于顯示p的值
obj1.getP=function(){
alert(this.p); //表面上this指針指向的是obj1
}
//調(diào)用obj1的getP方法
obj1.getP();
//使obj2的getP方法等于obj1的getP方法
obj2.getP=obj1.getP;
//調(diào)用obj2的getP方法
obj2.getP();
//-->
</script> 從代碼的執(zhí)行結(jié)果看,分別彈出對(duì)話框顯示1和2。由此可見,getP函數(shù)僅定義了一次,在不同的場(chǎng)合運(yùn)行,顯示了不同的運(yùn)行結(jié)果,這是有this指針的變化所決定的。在obj1的getP方法中,this就指向了obj1對(duì)象,而在obj2的getP方法中,this就指向了obj2對(duì)象,并通過this指針引用到了兩個(gè)對(duì)象都具有的屬性p。
由此可見,JavaScript中的this指針是一個(gè)動(dòng)態(tài)變化的變量,它表明了當(dāng)前運(yùn)行該函數(shù)的對(duì)象。由this指針的性質(zhì),也可以更好的理解JavaScript中對(duì)象的本質(zhì):一個(gè)對(duì)象就是由一個(gè)或多個(gè)屬性(方法)組成的集合。每個(gè)集合元素不是僅能屬于一個(gè)集合,而是可以動(dòng)態(tài)的屬于多個(gè)集合。這樣,一個(gè)方法(集合元素)由誰調(diào)用,this指針就指向誰。實(shí)際上,前面介紹的apply方法和call方法都是通過強(qiáng)制改變this指針的值來實(shí)現(xiàn)的,使this指針指向參數(shù)所指定的對(duì)象,從而達(dá)到將一個(gè)對(duì)象的方法作為另一個(gè)對(duì)象的方法運(yùn)行。
每個(gè)對(duì)象集合的元素(即屬性或方法)也是一個(gè)獨(dú)立的部分,全局函數(shù)和作為一個(gè)對(duì)象方法定義的函數(shù)之間沒有任何區(qū)別,因?yàn)榭梢园讶趾瘮?shù)和變量看作為window對(duì)象的方法和屬性。也可以使用new操作符來操作一個(gè)對(duì)象的方法來返回一個(gè)對(duì)象,這樣一個(gè)對(duì)象的方法也就可以定義為類的形式,其中的this指針則會(huì)指向新創(chuàng)建的對(duì)象。在后面可以看到,這時(shí)對(duì)象名可以起到一個(gè)命名空間的作用,這是使用JavaScript進(jìn)行面向?qū)ο蟪绦蛟O(shè)計(jì)的一個(gè)技巧。例如:
代碼片段
var namespace1=new Object();
namespace1.class1=function(){
//初始化對(duì)象的代碼
}
var obj1=new namespace1.class1();
這里就可以把namespace1看成一個(gè)命名空間。 mootools中的FX就是一個(gè)命名空間。
posted on 2008-08-06 22:33
楊愛友 閱讀(735)
評(píng)論(0) 編輯 收藏 所屬分類:
java相關(guān)技術(shù)