新手Javascript問題:是否可以通過公共方法訪問私有類屬性?
如何在公共方法中訪問私有類屬性?在所有的例子中,我看到一個訪問public(this.property)的公共原型函數。是否可以通過公共方法訪問私有財產?
新手Javascript問題:是否可以通過公共方法訪問私有類屬性?
如何在公共方法中訪問私有類屬性?在所有的例子中,我看到一個訪問public(this.property)的公共原型函數。是否可以通過公共方法訪問私有財產?
這種模式被稱爲「特權」方法。它看起來像這樣:
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;
};
這裏是一個小演示:
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(); // ...
希望它能幫助你。
這不符合你的想法。 [見本](http://jsfiddle.net/aAnM4/)。當您期望「b」時顯示「a」。 –
你可能認爲't'特定於每個實例,但它確實不是。一旦創建第一個實例並且所有其他實例將共享它,就會創建一次閉包。 – HMR
我不相信JavaScript有私人或公共財產的概念。事實上,這些課程並非原生語言。通常必須使用第三方庫來獲得OOP功能。 –
@FarleyKnight JavaScript使用基於原型的OO,即使是第三方庫也不會改變這一點。如果您使用TypeScript或Dart,則使用基於類的語言並編譯爲JavaScript。你會發現這些庫編譯的私有變量是公開的,因爲即使基於原型,你也不能擁有私有變量。您可以使用閉包完全隱藏成員,但這並不真正私有(相同類型的實例不能看到其他實例的「私有」)。 – HMR
我寫了一篇關於JavaScript的原型和構造函數的介紹。 JS OOP的工作方式不是基於類,可能需要一些習慣。在進入可以模擬私密性的更復雜模式之前,我建議您閱讀並理解基本知識,以便通過使用這些模式知道自己在犧牲什麼:http://stackoverflow.com/a/16063711/1641941 – HMR