我有一個關於JavaScript對象中的公共和私有變量的問題。以下是我一直在玩的簡單代碼,以便讓我的頭腦圍繞可變範圍以及私人和公共屬性。Javascript OOP公共和私有變量範圍
var fred = new Object01("Fred");
var global = "Spoon!";
function Object01(oName) {
var myName = oName;
this.myName = "I'm not telling!";
var sub = new subObject("underWorld");
this.sub = new subObject("Sewer!");
Object01.prototype.revealName = function() {
return "OK, OK, my name is: " + myName + ", oh and we say " + global;
}
Object01.prototype.revealSecretName = function() {
console.log ("Private: ");
sub.revealName();
console.log("Public: ");
this.sub.revealName();
}
}
function subObject(oName) {
var myName = oName;
this.myName = "My Secret SubName!";
subObject.prototype.revealName = function() {
console.info("My Property Name is: " + this.myName);
console.info("OK, my real name is: " + myName + ", yeah and we also say: " + global);
}
}
到目前爲止,我所觀察到的有趣的事情是我的對象中,一個普通的VAR是作爲私處理(很明顯,因爲他們是在一個功能塊)和this
版本是公開的。但我注意到,與this.xxx
同名的變量似乎被認爲是一個不同的變量。所以,在上面的例子中,我的對象fred
會報告this.myName
與我的功能相比有所不同,以拉我var myName
。
但是,對於我創建的子對象,這種相同的行爲是不一樣的。在var sub
與this.sub
的情況下,上述兩者均使用new subObject
調用來假定製造兩個子對象。但似乎this.sub
和var sub
返回Sewer!
版本。
索姆我有點搞不清楚爲什麼,如果我用字符串this.myName
和var myName
我得到兩個不同的結果,但我試圖做同樣的與其他對象不會產生類似的結果?我想這可能是因爲我錯誤地使用了它們,或者不瞭解this
和var
版本之間的差異。
這就是爲什麼影子變量被認爲是不好的做法:P – jbabey