Javascript 动态添加属性的新手查询

Javascript 动态添加属性的新手查询,javascript,Javascript,这是我上一篇文章的后续文章。从那以后,我一直在尝试一些代码: 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

这是我上一篇文章的后续文章。从那以后,我一直在尝试一些代码:

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的值?如果有人在代码之外意外删除了我的值怎么办?对于“objects”,我理解“Object.freeze()”可以帮助myFuncImpl,但是像myFunc这样的函数定义呢

  • 为什么我不能从myFuncImpl访问int3?先前的定义(定义myFunc时)去了哪里

  • 我想我的怀疑是因为我认为myFunc是一个“类”(在Java中)而myFuncImpl是一个对象。也许我走得太远了

    谢谢

  • int2
    实际上是一个私有变量,因此函数外部的代码无法检测到它


  • 这只是“香草”JS生活中的一个事实。如果需要防止覆盖值,请使用
    Object.defineProperty
    实现。此链接可能会回答您的一些问题-