|
公用、受保護(hù)和私有作用域
在傳統(tǒng)的面向?qū)ο蟪绦蛟O(shè)計中,主要關(guān)注于公用和私有作用域。公用作用域中的對象屬性可以從對象外部訪問,即開發(fā)者創(chuàng)建對象的實例后,就可使用它的公用屬性。而私有作用域中的屬性只能在對象內(nèi)部訪問,即對于外部世界來說,這些屬性并不存在。這也意味著如果類定義了私有屬性和方法,則它的子類也不能訪問這些屬性和方法。
最近,另一種作用域流行起來,即受保護(hù)作用域。雖然在不同語言中,受保護(hù)作用域的應(yīng)用的規(guī)則不同,但一般說來,它都用于定義私有的屬性和方法,只是這些屬性和方法還能被其子類訪問。
對ECMAScript討論這些作用域幾乎毫無意義,因為ECMAScript中只存在一種作用域――公用作用域。ECMAScript中的所有對象的所有屬性和方法都是公用的。因此,定義自己的類和對象時,必須格外小心。記住,所有屬性和方法默認(rèn)都是公用的。
許多開發(fā)者都在網(wǎng)上提出了有效的屬性作用域模式,解決了ECMAScript的這種問題。由于缺少私有作用域,開發(fā)者們制定了一個規(guī)約,說明哪些屬性和方法應(yīng)該被看作私有的。這種規(guī)約規(guī)定在屬性名前后加下劃線。例如:
這段代碼中,屬性color是私有的。記住,這些下劃線并不改變這些屬性是公用屬性的事實,它只是告訴其他開發(fā)者,應(yīng)該把該屬性看作私有的。
有些開發(fā)者還喜歡用單下劃線說明私有成員,例如obj._color。
靜態(tài)作用域并非靜態(tài)的
靜態(tài)作用域定義的屬性和方法任何時候都能從同一個位置訪問。在Java中,類可具有靜態(tài)屬性和方法,無需實例化該類的對象,即可訪問這些屬性和方法,例如Java.NET.URLEncoder類,它的函數(shù)encode()即是靜態(tài)方法。
嚴(yán)格說來,ECMAScript并沒有靜態(tài)作用域。不過,它可以給構(gòu)造函數(shù)提供屬性和方法。還記得嗎,構(gòu)造函數(shù)只是函數(shù)。函數(shù)是對象,對象可以有屬性和方法。例如:
這里,方法alternate()實際上是函數(shù)sayHi的方法。可以像調(diào)用常規(guī)函數(shù)一樣調(diào)用sayHi()輸出"hi",也可以調(diào)用sayHi.alternate()輸出"hola"。即使如此,alternate()也是sayHi()公用作用域中的方法,而不是靜態(tài)方法。
JavaScript技術(shù):Javascript 作用域使用說明,轉(zhuǎn)載需保留來源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。