翻譯大半,發現有人翻譯過了,而且翻譯地還比較好。但是還是硬著頭皮翻下去了,並參考他的做了修改,就作為我翻譯e文的第一次吧。
原文:http://javascript.crockford.com/private.html
javascript是全世界最被誤解的語言。有些人覺得它缺少隱藏資訊的機制,因為javascript的對象沒有私人變數和方法。但這是種誤解。javascript也有私人成員。讓我們看看吧。
對象:
javascript是基於對象的。數組(Arrays)是對象,函數(Functions)是對象,對象尼瑪也是對象。什麼是對象呢?對象是名-值的集合。名是字串,值可以是字串,數字,布爾型和對象(包括數組和函數)。通常對象會被實現為hashtables,這樣資料就可以很快地擷取。
如果值是函數,我們可以把它當做一個方法。當方法被對象調用,這個變數會被賦予到這個對象。這個方法可以擷取對象的變數。
對象可以通過(constructors)建構函式創造,建構函式提供的功能包括靜態變數和方法。
共有成員:
對象中所有的方法都是共有的。任何函數都可以調用,修改或者刪除,或者增加新的方法。這裡有兩種主要的方式來增加成員到一個新對象中:
利用建構函式:
這種技巧通常被用在初始化公用實體變數,建構函式的this變數被用來增加共有變數到對象中。
function Container(param) { this.member = param;}
所以,如果我們構造一個對象
var myContainer = new Container('abc');
那麼 myContainer.member 包括 ’abc‘。
利用原型
這種技巧通常會被用到增加共有方法。當查到一個成員而在相應對象中沒有找到時,就會去建構函式的portotype中尋找。原型的原理常被用來實現繼承。它同時也節省記憶體。如果要添加一個方法到所有的對象執行個體中,可以通過在建構函式的原型中添加一個函數來實現:
Container.prototype.stamp = function (string) { return this.member + string;}
然後,我們可以這樣調用:myContainer.stamp('def')。
結果返回'abcedf'。
私人成員:
私人變數通過建構函式實現,普通的var變數和建構函式的參數將變成私人成員。
function Container(param) { this.member = param; var secret = 3; var that = this;}
這個建構函式建立了3個參數:param,secret和that。它們都能被對象內部訪問,但是無法從外面被訪問。它們可以訪問對象的共有方法,也可以被私人方法訪問,私人方法是建構函式的內建函式。
function dec() { if (secret > 0) { secret -= 1; return true; } else { return false; } } this.member = param; var secret = 3; var that = this;}
私人方法dec檢查執行個體變數secret。如果大於0,secret減去1,並返回true,否則返回false。這種方式可以用在限制這個對象的使用次數。按照慣例,我們定義一個私人的變數that。它被用於讓對象對私人方法可見,這是ECMAScript語言規範的一個錯誤,引起this變數不能正確地對內建函式進行複製的一個解決方案。私人方法不能被共有方法返回。為了使私人方法更有用,我們需要一種方法:特權方法。
特權方法
特權方法可以訪問私人變數和方法,對共有方法也是可見的。一個特許方法可能被刪除或者替換,但是不可以修改它,除非完全被替換。
privileged 方法被分配給建構函式的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 () { return dec() ? that.member : null; };}
service是一個特許方法,前3次調用myContainer.service()會返回‘abc’,之後會返回null。service方法調用了私人方法dec,以便訪問私人變數seret。service同樣對其它對象和方法也是可見的,但是它不允許直接存取私人屬性。
Closurs(閉包)
public,private和privileged等模式之所以存在,是因為javascript·擁有閉包屬性。閉包在這裡的意思是內部的函數可以調用外部的函數,即使外部函數已經返回了。這個是非常有用的一種特性。目前還沒有書介紹如何利用 這個特性,有些甚至都沒有提到。
私人成員和特權成員只有在物件建構的時候實現,公有成員可以在任何時候增加。
編寫入模式
public
function Constructor(...) { this.membername = value; }Constructor.prototype.membername = value;
private
function Constructor(...) { var that =this; var membername = value; function membername(...) {...} }
注意:函式宣告function membername(...){...} 是下面這句var membername = function membername(...){...}的縮寫;
privileged:
function Constructor(...) { this.membername = function (...) {...}; }
thomescai http://blog.csdn.net/thomescai(轉載請保留)
參考資料:
http://www.funnyhao.com/test/private-members-in-js.html