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

來源:互聯網
上載者:User

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.