我有一个关于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