2013-10-04 105 views
2

我希望能夠在Javascript中創建一個具有可訪問該對象私人會員的公共方法的對象。但是,我聽說每次創建對象時都會聲明公共方法,所以我寧願避免這種開銷。因此,例如,該代碼會做我想做的:以Javascript訪問私人會員的公共方法

function createMyObject(parameter) { 
    var that = {}; 

    var privateVariable, 
     privateMethod = function() { return 1; }; 

    that.publicVariable = 0; 

    that.publicMethod = function() { 
     privateVariable = privateMethod(); 
    } 

    return that; 
} 

但每次有人打電話createMyObject,它必須創建函數來設置的公共方法。相反,如果我這樣做:

function MyClass(parameter) { 
    var privateVariable, 
     privateMethod = function() { return 1; }; 

    this.publicVariable = 0; 
} 

MyClass.prototype.publicMethod = function() {}; 

在這裏,我能避免產生新的功能設置公共方法每次一個對象被構造,但這些公共方法不能訪問對象的私有成員。

是否有某種方法可以避免每次創建對象時必須爲公共方法創建新函數的開銷,還能夠讓他們訪問私有成員?

+0

您可以使用自我調用功能來隱藏您的'私人'功能,但不能創建不在實例之間共享的私有變量。 –

回答

3

不,你不能。

能夠訪問私有變量的公共方法稱爲特權方法

Private Members in JavaScript,由Douglas Crockford的:

一個特權方法能夠訪問私有變量和 方法,而且本身向公衆開放的方法和 之外。可以刪除或替換特權方法,但不可能改變它,或強制它放棄其祕密。

特權方法在構造函數中被指定爲this

然後,您不能使用原型聲明特權方法。

0

使用新的Javascript功能,你可以有真正的私人成員。基本上你可以使用WeakMap來隱藏你的成員。

這在Firefox中支持,並且在Chromium的「實驗性Javascript」標誌後面。

var MyClass = (function(){ 
    var privmap = new WeakMap; // This holds our private members. Keep it secret. 

    function MyClass(){ 
     var priv = {}; 
     privmap.set(this, priv); // Add your private object for this instance. 

     this.notsec = "Anyone can access this!"; 
     priv.secret = "Only code in this closure can see this!"; 
    } 
    MyClass.prototype.secret = function MyClass_secret() { 
     var priv = privmap.get(this); // Get our private object. 
     return priv.secret; // Retrieve. 
    } 

    return MyClass; 
})(); 

var o = new MyClass; 
console.log(o.secret()); //-> Only code in this closure can see this! 

通過在每個函數的開頭添加一行,您可以返回您的私有對象。我喜歡稱它爲priv,以便公衆成員繼續this和私人priv,很好,一致。

這具有很好的優勢,您只有每個方法的單個實例,而不是爲每個實例創建閉包。