放下對象
我們再來看看function與object的超然結合吧。
在面向對象的編程世界里,數(shù)據(jù)與代碼的有機結合就構成了對象的概念。自從有了對象,編程世界就被劃分成兩部分,一個是對象內的世界,一個是對象外的世界。對象天生具有自私的一面,外面的世界未經(jīng)允許是不可訪問對象內部的。對象也有大方的一面,它對外提供屬性和方法,也為他人服務。不過,在這里我們要談到一個有趣的問題,就是“對象的自我意識”。
什么?沒聽錯吧?對象有自我意識?
可能對許多程序員來說,這的確是第一次聽說。不過,請君看看C++、C#和Java的this,DELPHI的self,還有VB的me,或許你會恍然大悟!當然,也可能只是說句“不過如此”而已。
然而,就在對象將世界劃分為內外兩部分的同時,對象的“自我”也就隨之產(chǎn)生!白晕乙庾R”是生命的最基本特征!正是由于對象這種強大的生命力,才使得編程世界充滿無限的生機和活力。
但對象的“自我意識”在帶給我們快樂的同時也帶來了痛苦和煩惱。我們給對象賦予了太多欲望,總希望它們能做更多的事情。然而,對象的自私使得它們互相爭搶系統(tǒng)資源,對象的自負讓對象變得復雜和臃腫,對象的自欺也往往帶來揮之不去的錯誤和異常。我們?yōu)槭裁磿羞@么多的痛苦和煩惱呢?
為此,有一個人,在對象樹下,整整想了九九八十一天,終于悟出了生命的痛苦來自于欲望,但究其欲望的根源是來自于自我意識。于是他放下了“自我”,在對象樹下成了佛,從此他開始普度眾生,傳播真經(jīng)。他的名字就叫釋迦摩尼,而《JavaScript真經(jīng)》正是他所傳經(jīng)書中的一本。
JavaScript中也有this,但這個this卻與C++、C#或Java等語言的this不同。一般編程語言的this就是對象自己,而 JavaScript的this卻并不一定!this可能是我,也可能是你,可能是他,反正是我中有你,你中有我,這就不能用原來的那個“自我”來理解 JavaScript這個this的含義了。為此,我們必須首先放下原來對象的那個“自我”。
我們來看下面的代碼:
function WhoAmI() //定義一個函數(shù)WhoAmI { alert("I'm " + this.name + " of " + typeof(this)); }; WhoAmI(); //此時是this當前這段代碼的全局對象,在瀏覽器中就是window對象,其name屬性為空字符串。輸出:I'm of object
var BillGates = {name: "Bill Gates"}; BillGates.WhoAmI = WhoAmI; //將函數(shù)WhoAmI作為BillGates的方法。 BillGates.WhoAmI(); //此時的this是BillGates。輸出:I'm Bill Gates of object var SteveJobs = {name: "Steve Jobs"}; SteveJobs.WhoAmI = WhoAmI; //將函數(shù)WhoAmI作為SteveJobs的方法。 SteveJobs.WhoAmI(); //此時的this是SteveJobs。輸出:I'm Steve Jobs of object
WhoAmI.call(BillGates); //直接將BillGates作為this,調用WhoAmI。輸出:I'm Bill Gates of object WhoAmI.call(SteveJobs); //直接將SteveJobs作為this,調用WhoAmI。輸出:I'm Steve Jobs of object BillGates.WhoAmI.call(SteveJobs); //將SteveJobs作為this,卻調用BillGates的WhoAmI方法。輸出:I'm Steve Jobs of object SteveJobs.WhoAmI.call(BillGates); //將BillGates作為this,卻調用SteveJobs的WhoAmI方法。輸出:I'm Bill Gates of object
WhoAmI.WhoAmI = WhoAmI; //將WhoAmI函數(shù)設置為自身的方法。 WhoAmI.name = "WhoAmI"; WhoAmI.WhoAmI(); //此時的this是WhoAmI函數(shù)自己。輸出:I'm WhoAmI of function ({name: "nobody", WhoAmI: WhoAmI}).WhoAmI(); //臨時創(chuàng)建一個匿名對象并設置屬性后調用WhoAmI方法。輸出:I'm nobody of object
從上面的代碼可以看出,同一個函數(shù)可以從不同的角度來調用,this并不一定是函數(shù)本身所屬的對象。this只是在任意對象和function元素結合時的一個概念,是種結合比起一般對象語言的默認結合更加靈活,顯得更加超然和灑脫。
在JavaScript函數(shù)中,你只能把this看成當前要服務的“這個”對象。this是一個特殊的內置參數(shù),根據(jù)this參數(shù),您可以訪問到“這個”對象的屬性和方法,但卻不能給this參數(shù)賦值。在一般對象語言中,方法體代碼中的this可以省略的,成員默認都首先是“自己”的。但JavaScript卻不同,由于不存在“自我”,當訪問“這個”對象時,this不可省略!
JavaScript提供了傳遞this參數(shù)的多種形式和手段,其中,象BillGates.WhoAmI()和SteveJobs.WhoAmI()這種形式,是傳遞this參數(shù)最正規(guī)的形式,此時的this就是函數(shù)所屬的對象本身。而大多數(shù)情況下,我們也幾乎很少去采用那些借花仙佛的調用形式。但只我們要明白JavaScript的這個“自我”與其他編程語言的“自我”是不同的,這是一個放下了的“自我”,這就是JavaScript特有的世界觀。
出處:軟件真諦
責任編輯:moby
上一頁 奇妙的對象 下一頁 對象素描
◎進入論壇網(wǎng)頁制作、WEB標準化版塊參加討論,我還想發(fā)表評論。
|