新手查询动态添加属性

Newbie query on dynamic addition of properties

本文关键字:属性 添加 动态 查询 新手      更新时间:2023-09-26

这是我上一次查询的后续操作。从那以后,我一直在尝试一些代码:

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是一个对象。也许我走得太远了?

谢谢!

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

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

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