JavaScript中的私有成員(轉載)

JavaScript中的私有成員

Douglas Crockford
www.crockford.com

翻譯:ShiningRay

http://www.nirvanastudio.org/

 

JavaScript 是世界上最被誤解的語言。很多人認爲它缺乏信息隱藏的特性所以對象不能有私有實例變量和方法。但這是一個誤解。JavaScript對象同樣可以擁有私有變量。下面就講解一下:

對象

JavaScript根本上是關於的。數組Array是對象,函數Function是對象,Object就不說了。那什麼是對象?對象是名稱-值的配對的集合。名稱是字符串,值可以是字符串、數字、布爾值和對象(包括數組和函數)。對象常常實現爲哈希表以快速存取值。

如果一個值是函數,我們可以將它視爲方法method。當調用一個對象的方法時,this 變量就會被設爲該對象。這個方法就可以通過this變量訪問實例變量。

對象是由構造器constructor產生的,它是初始化對象的函數。構造器提供了其它語言中類提供的特性,包括靜態方法和變量。

公共成員

對象的成員都是 public 公共成員。任何函數都可以訪問、修改或者刪除這些成員。有兩種主要的途徑給新的對象加入成員:

構造器中

這個技術一般用來初始化公共實例變量。構造器的this變量是用來向對象添加成員的。

    

這樣,如果我們構造一個新的對象


那麼myContainer.member 就會包含'abc'

原型中

這個技巧一般用來添加公共方法。當一個成員被檢索且沒有在對象中發現的時候,那麼它就會從對象構造器的 prototype 成員中去獲取它。這個原型機制可用來實現繼承。它也保存內存。要爲一個構造器生成的所有對象加入一個方法,將函數加入構造器的prototype :

    

這樣,我們可以調用這個方法


它會返回'abcdef'.

私有成員

私有Private成員要由構造器生成。構造器中的普通的var變量和參數都成爲私有成員。

    
    
    

這個構造器有三個私有實例變量:param, secret, self。它們被附加到了對象上,但它們無法從外部訪問,同時它們也無法被這個對象的公共方法所訪問。他們只對私有成員可見。私有方法則是構造器內部的函數。


    
        
            
            
        
            
        
    

    
    
    

私有方法 dec 檢查 secret 實例變量。如果它大於0,就減少 secret 的大小並返回 true 。否則它返回 false 。這個可以限制對象使用三次。

按照慣例,我們給出一個私有的 self 參數。這個可以令對象對私有方法可見。這種做法是因爲ECMAScript Language Specification中的一個錯誤,這個錯誤令 this 不能正確地對內部函數設置。

私有方法無法被公共方法調用。要令私有方法有用,我們需要引入一種特權方法。

特權成員

一個特權A privileged 方法可以訪問私有的變量和方法,同時它對公共域可見。也可以刪除或替換一個特權方法,但不能改變它。

特權方法是用 this 在構造器中分配的。


    
        
            
            
        
            
        
    

    
    
    

    
        
            
        
            
        
    

service 就是一個特權方法。前三次調用會返回'abc' 。之後 ,它會返回 nullservice調用的私有的 dec 方法,而 dec 又訪問了私有的 secret 變量。service 對其它的對象和方法是可見的,但不能直接訪問私有成員。

閉包

這種公共、私有和特權成員的模式是可行的原因是由於JavaScriptclosure閉包。這個意味着一個內部的函數總是可以訪問這個函數外部的變量和參數,甚至在外部的函數返回之後。這是這個語言的一個極其強大的特性。目前沒有哪本關於JavaScript編程的書展示瞭如何發掘這個特性。大多數都沒有提到。

私有和特權成員只能在對象構造的時候生成。公共成員可以在任意時刻添加。

Patterns模式

Public公共

function Constructor(...) {
this.membername = value;
}
Constructor.prototype.membername = value;

Private私有

function Constructor(...) {
var self = this;
var
membername = value;
function membername(...) {...}
}
Note: The function statement
function membername(...) {...}
is shorthand for
var membername = function membername(...) {...};

Privileged特權

function Constructor(...) {
this.membername = function (...) {...};
}

Copyright 2001 Douglas Crockford. All Rights Reserved Wrrrldwide.

轉自:http://shiningray.cnblogs.com/shiningray/articles/143004.html

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