Private Members In JavaScript(javascript的私有成員)——翻譯

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章