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";、「static」プロパティが変更されたことです。静的定数 を混同しないでくださいhttp://elegantcode.com/2011/01/19/basic-javascript-part-7-static-properties-and-methods/

于 2012-08-30T15:28:12.343 に答える