特權(quán)
特權(quán)方法可以訪問私有變量和方法,并且其自身對于公共方法和對象外部都是可訪問地?梢詣h除或者替換一個特權(quán)方法,但是不能改變它,或者強迫它泄密。
特權(quán)方法是在構(gòu)造函數(shù)內(nèi)使用 this 指定地。
function Container(param) { function dec() { if (secret > 0) { secret -= 1; return true; } else { return false; } } this.member = param; var secret = 3; var that = this; this.service = function () { if (dec()) { return that.member; } else { return null; } }; }
service 就是特權(quán)方法。前三次調(diào)用 myContainer.service() 時會返回 ‘a(chǎn)bc’。之后返回空(null)。service 調(diào)用了可訪問私有變量 secret 的私有方法 dec。service 對其他對象和方法都是可見的,但是不能直接訪問私有成員。
閉包
由于 Javascript 有閉包,因此這種公共,私有和特權(quán)成員模型時可以的。這意味著內(nèi)部函數(shù)總是可以訪問它外部函數(shù)的變量和參數(shù),甚至在外部函數(shù)返回后也可以。這是這個語言一個非常有用的特性。目前沒有任何關(guān)于 Javascript 編程的書描述了如何利用它。大部分甚至都不提及它。(糖伴西紅柿說,這是2001年的文章,當(dāng)時估計還沒有這方面的研究文章。現(xiàn)在來說,犀牛書等都有涉及,javascript 的難點之一啊。)
私有和特權(quán)成員只在對象被創(chuàng)建時生成。公共成員可以隨時添加。
模式
公共
function Constructor(...) { this.membername = value; } Constructor.prototype.membername = value;
私有
function Constructor(...) { var that = this; var membername = value; function membername(...) {...} }
注意:函數(shù)語句
function membername(...) {...}
是
var membername = function membername(...) {...};
的縮寫。
特權(quán)
function Constructor(...) { this.membername = function (...) {...}; }
糖伴西紅柿說:
好久沒露面,本來就沒人記得我,這次更無名了。最近從高麗遷移回了天朝,嗯。而且正在為了工作進(jìn)行最后的充電活動。生活中同時也遭遇到電視劇情節(jié),還是高麗電視劇。這兩天在主攻 Javascript 中幾個比較難的知識點,閉包算是其中之一。兩天看了好多關(guān)于閉包的文章,才有點開竅,這篇文章屬于其中之一。算是個額外的參考資料,主要的是另一篇英文文章,有打算全篇翻譯。
原文地址:http://www.crockford.com/javascript/private.html 譯文地址:http://www.qianduan.net/?p=6580
本文鏈接:http://www.95time.cn/tech/web/2009/6538.asp
出處:前端觀察
責(zé)任編輯:bluehearts
上一頁 JavaScript的私有成員 [1] 下一頁
◎進(jìn)入論壇網(wǎng)頁制作、WEB標(biāo)準(zhǔn)化版塊參加討論,我還想發(fā)表評論。
|