0

这是我之前的查询的后续。从那以后我一直在尝试一些代码:

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 时)去哪儿了?

我想我的怀疑是由于我认为 myFunc 作为一个“类”(如在 Java 中)和 myFuncImpl 作为一个对象。也许我走得太远了?

谢谢 !

4

1 回答 1

0
  1. int2实际上是一个私有变量,因此函数外部代码无法检测到它http://javascript.crockford.com/private.html

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

  3. int3是函数的“静态”属性。它在实例上不可用,有点像在 C# 中,如果你有一个静态方法,它对类的实例不可用。这里的区别是你可以稍后在你的代码中说myFunc.int1 = "asdf";,现在你的“静态”属性已经改变了。不要将静态常量混淆 http://elegantcode.com/2011/01/19/basic-javascript-part-7-static-properties-and-methods/

于 2012-08-30T15:28:12.343 回答