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指針指向的是obj1javascript