【发布时间】:2012-09-03 17:14:12
【问题描述】:
我有一个关于 Javascript 对象中的公共和私有变量的问题。这是我一直在使用的简单代码,用于了解变量范围以及私有和公共属性。
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! 版本。
Som 我有点困惑,为什么如果我对 this.myName 和 var myName 使用字符串我会得到两个不同的结果,但我尝试对另一个对象做同样的事情却不会产生类似的结果?我想可能是我用错了,或者不理解this 和var 版本之间的区别。
【问题讨论】:
-
这就是为什么影子变量被认为是一种不好的做法:P
标签: javascript oop scope