3

私はjsを使って楽しんでいます。今、私はただイライラしています。上司が購入した大量のコードを jsDoc しようとしています。著者は API を提供していないので、jsDoc を使用して作成します。

残念ながら、コードは明確ではなく、1 つの js ファイルに約 10,000 行のコードが含まれています。私は過去にオブジェクトリテラルを使用しましたが、これはオブジェクトリテラルではありません。パラメータと関数はコンマで区切られていません。さらに、プロトタイプは使用されませんが、新しい演算子は使用されます。私はいくつかの本を見てきましたが、名前空間が最も近い「スタイル」のようです。これがプログラムの大まかな流れです。私の質問は例に従います。

(function () {
var global = (function () {return this; } ).call();
global.X = {};
})();

X.init = function(){
    X.MyObjectA = new X.FooA();
    X.MyObjectB = new X.FooB();
}

X.FooA = function() {
   var storeStuff;
   do stuff
   .
   .
   function bar(){
        var storeSomething;
        do something
        do somthing else
        .
        .
        moreFunctions(){}
        var moreVars;
        .
        .

    }

    this.anOccasionalFunctionLiteral = function(){}
        .
        .
}

X.FooB = function(){
    Similar contents of FooB()
 }
 .
 .
 .
 Continues forever...

だから私の質問は:

  1. これは何のスタイル!? スタイルと言うとき、私は本当に FooA と FooB が何であるかを意味していると思いますか? それらはオブジェクトですか?クラス?

  2. X.FooA または X.FooB のメンバーでない場合、ネストされた関数にどのようなタイトルを付ける必要がありますか。bar() を含むネストされた関数は、オブジェクトFooA および FooB のメソッドではないと言われました。

  3. オブジェクト内にネストされた関数が、実際には周囲のオブジェクトのメソッドではない場合、どこからでも呼び出すことができますか? または、通常のスコープ ルールが適用されますか?

人生をより読みやすく幸せにするために、私はFooA と FooB に似たオブジェクトをコンストラクターとして分類し、コンストラクター内のメソッド (bar() など) を FooA と FooB のメソッドとして分類してきました。これは正しくないかもしれませんが、少なくとも組織化されています。助言がありますか?

ご協力いただきありがとうございます!

4

3 に答える 3

3

FooA と FooB はコンストラクター関数です。

ネストされた関数は「プライベート」関数です。

FooA 内の bar 関数は、FooA 内でのみ呼び出すことができます。

http://javascript.crockford.com/private.htmlを参照してください 。

于 2012-12-28T03:11:22.280 に答える
1

1) 名前空間の予感は正しかったと思います。最初の自己実行無名関数は、グローバル名前空間を取得します。彼らはおそらく次のような単純なことをしていませんでした:

window.X = {};

「window」がグローバル オブジェクトでない環境では機能しないためです。(サーバー上のnodejsのように)

2) 私はこれらのメソッドを呼び出しません。個人的には、それらの機能の実際の機能が何であるかに依存すると思います。それらは、オブジェクトのさらなる名前空間またはコンストラクターのように機能する可能性があります。それらが大文字になっている場合、作成者はおそらくそれらをメソッドではなく名前空間またはクラスとして考えていたでしょう。

3) bar() 関数は X.FooA からのみ呼び出すことができますが、実際に宣言される前にX.FooA 内で呼び出すことができることに注意してください。

X.FooA = function() {
  bar(); // this will work
  function bar() {
    alert('this will work');
  }
}

これは、コードが評価されるときに、関数宣言が周囲の関数の先頭に巻き上げられるためです。ただし、bar 関数は X.FooA 以外では使用できません。

bar をメソッドとして分類するとは思いません。おそらく、「プライベート関数」または「プライベートメソッド」の方が適切です。

于 2012-12-28T03:11:21.640 に答える
1

FooA と FooB は「X」オブジェクトに含まれるクラスのようです。定義されたクラス内の匿名関数は基本的にプライベート メソッドですが、名前付き関数はそれを含むクラスのパブリック メソッドです。

var x = {
 classA:function(){
  do class constructor stuff...
  function myPrivateMethod(){do stuff...}
  this.myPublicMethod = function(){do stuff...}
 },
 classB:{another class contained in the object}
}
于 2012-12-28T03:11:34.533 に答える