2013-11-27 63 views
0

新手Javascript問題:是否可以通過公共方法訪問私有類屬性?

如何在公共方法中訪問私有類屬性?在所有的例子中,我看到一個訪問public(this.property)的公共原型函數。是否可以通過公共方法訪問私有財產?

+1

我不相信JavaScript有私人或公共財產的概念。事實上,這些課程並非原生語言。通常必須使用第三方庫來獲得OOP功能。 –

+0

@FarleyKnight JavaScript使用基於原型的OO,即使是第三方庫也不會改變這一點。如果您使用TypeScript或Dart,則使用基於類的語言並編譯爲JavaScript。你會發現這些庫編譯的私有變量是公開的,因爲即使基於原型,你也不能擁有私有變量。您可以使用閉包完全隱藏成員,但這並不真正私有(相同類型的實例不能看到其他實例的「私有」)。 – HMR

+0

我寫了一篇關於JavaScript的原型和構造函數的介紹。 JS OOP的工作方式不是基於類,可能需要一些習慣。在進入可以模擬私密性的更復雜模式之前,我建議您閱讀並理解基本知識,以便通過使用這些模式知道自己在犧牲什麼:http://stackoverflow.com/a/16063711/1641941 – HMR

回答

3

這種模式被稱爲「特權」方法。它看起來像這樣:

function MyClass() { 
    var secret = "foo"; 
    this.tellSecret = function() { 
    return secret; 
    }; 
} 

var inst = new MyClass(); 
console.log(inst.tellSecret()); // => "foo" 
console.log(inst.secret);  // => undefined 

這是可行的,因爲私有變量在閉包中。問題在於,我們將特權方法放在每個實例上,而不是原型上。這並不理想。通常情況下,而不必在JavaScript中私有變量,作者將只使用它通常用於意味着公共方法前面的下劃線/屬性應被視爲私有:

function MyClass() { 
    this._secret = "foo"; 
} 

MyClass.prototype.tellSecret = function() { 
    return this._secret; 
}; 
0

這裏是一個小演示:

var Foo = function(name){ 
    this.name = name; 
    var t = name; 
    if(typeof(this.show) != 'function'){ 
     Foo.prototype.show = function(){ 
      console.log(t); 
      console.log(this.name); 
     }; 
    } 
}; 

var a = new Foo('a'); 
var b = new Foo('b'); 
b.show(); // ... 

希望它能幫助你。

+0

這不符合你的想法。 [見本](http://jsfiddle.net/aAnM4/)。當您期望「b」時顯示「a」。 –

+0

你可能認爲't'特定於每個實例,但它確實不是。一旦創建第一個實例並且所有其他實例將共享它,就會創建一次閉包。 – HMR

相關問題