关于动态添加属性的新手查询

时间:2012-08-30 15:21:18

标签: javascript

这是我之前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

我无法回答以下问题:

  1. 为什么 int2 不作为myFunc的属性可见?它仍然在myFunc的范围内,对吗?这个定义在哪里消失了?

  2. 为什么我能够在函数范围之外覆盖 int1 的值?如果有人在代码外意外删除了我的值,该怎么办?对于“对象”,我理解“Object.freeze()”可以帮助myFuncImpl - 但是像myFunc这样的函数定义呢?

  3. 为什么我无法从myFuncImpl访问 int3 ?先前的定义(定义myFunc时)在哪里?

  4. 我想我的怀疑是由于我将myFunc视为“类”(如Java)和myFuncImpl作为对象。也许我偏离太远了?

    谢谢!

1 个答案:

答案 0 :(得分:0)

  1. int2 有效私有变量,因此函数外部的代码无法检测到它http://javascript.crockford.com/private.html

  2. 这只是“香草”JS的生活现实。如果您需要阻止覆盖值,请使用Object.defineProperty实施。 IE< 9

  3. 的注意事项
  4. int3是函数的“静态”属性。它在实例上不可用,有点像在C#中,如果你有一个静态方法,它不适用于类的实例。不同之处在于您可以在以后的代码中说myFunc.int1 = "asdf";,现在您的'静态'属性已更改。不要将静态常量混淆 http://elegantcode.com/2011/01/19/basic-javascript-part-7-static-properties-and-methods/