这是我之前query的后续内容。从那以后我一直在尝试一些代码:
var myFunc = function(){
this.int1=1;
var int2=2;
};
myFunc.int1=3;
myFunc.int3=4;
for(var name in myFunc){
console.log('myFunc...'+name+'='+myFunc[name]);
};
var myFuncImpl = new myFunc();
myFuncImpl.int1=5;
for(var name in myFuncImpl){
console.log('myFuncImpl...'+name+'='+myFuncImpl[name]);
};
我输出为:
myFunc...int1=3
myFunc...int3=4
myFuncImpl...int1=5
我无法回答以下问题:
为什么 int2 不作为myFunc的属性可见?它仍然在myFunc的范围内,对吗?这个定义在哪里消失了?
为什么我能够在函数范围之外覆盖 int1 的值?如果有人在代码外意外删除了我的值,该怎么办?对于“对象”,我理解“Object.freeze()”可以帮助myFuncImpl - 但是像myFunc这样的函数定义呢?
为什么我无法从myFuncImpl访问 int3 ?先前的定义(定义myFunc时)在哪里?
我想我的怀疑是由于我将myFunc视为“类”(如Java)和myFuncImpl作为对象。也许我偏离太远了?
谢谢!
答案 0 :(得分:0)
int2
有效私有变量,因此函数外部的代码无法检测到它http://javascript.crockford.com/private.html
这只是“香草”JS的生活现实。如果您需要阻止覆盖值,请使用Object.defineProperty
实施。 IE< 9
int3
是函数的“静态”属性。它在实例上不可用,有点像在C#中,如果你有一个静态方法,它不适用于类的实例。不同之处在于您可以在以后的代码中说myFunc.int1 = "asdf";
,现在您的'静态'属性已更改。不要将静态与常量混淆
http://elegantcode.com/2011/01/19/basic-javascript-part-7-static-properties-and-methods/