翻譯大半,發現有人翻譯過了,而且翻譯地還比較好。但是還是硬着頭皮翻下去了,並參考他的做了修改,就作爲我翻譯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(轉載請保留)
參考資料: