2013-08-01 69 views
0

我正在使用原型函數,因爲當「類」被多次實例化時,它們應該具有更好的性能。也不是所有的變量都應該可以被外部訪問,所以它們是通過var在「類」內部定義的,所以它們不能在封閉空間外的任何地方訪問。JavaScript:原型函數中的私有變量

現在我有這個簡單的例子,我定義了一個「私人」變量,並定義它並獲取函數。

例子:

function Test() { 
    var hello = "org"; 

    this._get = function (value) { 
      hello = value; 
    } 
    this._set = function (value) {    
     return hello;    
    } 
} 


var test = new Test(); 
console.log(test._get()); 
test._set("new"); 
console.log(test._get()); 

提琴手:http://jsfiddle.net/LdwuS/

現在我想要做同樣的原型,但get函數總是返回undefined!

例子:

function Test() { 
    var hello = "org"; 
} 

Test.prototype.set = function (value) { 
    return hello; 
} 
Test.prototype.get = function (value) { 
    hello = value; 
} 

var test = new Test(); 
console.log(test.get()); 
test.set("new"); 

提琴手:http://jsfiddle.net/rK22m/

我做得不對,或者這是不可能的? console.log(test.get());

+1

不可能從該函數外部定義的函數中訪問函數中定義的變量。這包括'.prototype'上的函數。 –

+2

......並且在第二個例子中,您已將「set」和「get」行爲顛倒過來。 –

+0

ECMAScript 6可能會定義對屬性的「鍵控」訪問,您可以在其中要求該鍵訪問某些屬性,從而提供對象上的私有成員等。 –

回答

4

與原型對象相關的函數具有與任何其他函數完全相同的對象訪問類型。此外,與其他函數一樣,它們在調用構造函數時存在對構造函數中存在的局部變量的訪問no

-2

http://jsfiddle.net/uy38G/

做這樣的工作

function Test(){ 
    var hello = "org"; 

    this.getHello = function(){ 
     return hello; 
    } 

    this.setHello = function(value){ 
     return hello = value; 
    } 
} 

var test = new Test(); 

console.log(test.getHello()); 
test.setHello('new org'); 
console.log(test.getHello()); 
+2

你的意思是,就像OP已經在問題的第一個代碼示例中那樣做了嗎? –

+0

他從此編輯了他的第一個例子。 – zcreative

+0

第一個例子沒有改變。 –

1

不幸的是,你根本無法做到你想做到什麼,因爲創建訪問私有變量公共職能的唯一途徑JavaScript是在私有變量的相同範圍內聲明這些函數,以便這些函數創建一個閉包,然後公開這些函數。

您必須做出犧牲使用原型的好處或犧牲強制隱私的選擇。一個被廣泛採用的解決方案是依靠文檔來識別私有屬性,或者用_等字符作爲前綴。但是,您總是可以將某些功能完全私有化。

var MyClass = (function() { 
    function MyClass() { 
     //private 
     this._private = 'private'; 
     this.public = 'public'; 

     //call privateFunction in the context of the current instance 
     privateFunction.call(this); 
    } 

    //public functions 
    MyClass.prototype.publicFunction = function() { 
    }; 

    //private function 
    function privateFunction() { 
    } 

    return MyClass; 

})();