2

JavaScriptのオブジェクトは、以下の2つの方法で最も一般的に編成されています。誰かが2つの違いと利点を説明できますか?一方が他方に適している場合はありますか?

どんな説明でも本当に感謝します。どうもありがとう!

初め:

   var SomeObject;

    SomeObject = (function() {

     function SomeObject() {}

         SomeObject.prototype.doSomething: function() {

         },
         SomeObject.prototype.doSomethingElse: function() {

         }

    })();

2番:

SomeObject = function() {

 SomeObject.prototype.doSomething: function() {

 },
 SomeObject.prototype.doSomethingElse: function() {

 }

}
4

3 に答える 3

5

これらの例は両方とも正しくありません。私はあなたが意味したと思います:

初め:

var SomeObject;
SomeObject = (function() {

    function SomeObject() {
    }

    SomeObject.prototype.doSomething = function() {
    };

    SomeObject.prototype.doSomethingElse = function() {
    };

    return SomeObject;

})();

(無名関数の最後の戻り値、=ではなくの使用:、および関数の割り当てを完了するためのセミコロンに注意してください。)

またはおそらくあなたは意味しました:

function SomeObject() {
}

SomeObject.prototype.doSomething = function() {
};

SomeObject.prototype.doSomethingElse = function() {
};

(匿名の囲み機能はありません。)

2番:

function SomeObject() {
}
SomeObject.prototype = {

    doSomething: function() {
    },
    doSomethingElse: function() {
    }
};

(プロトタイプへの割り当ては関数の外部にあることに注意してください。ここSomeObjectでは:、オブジェクト初期化子の内部にあるため使用します。また;、最後に割り当てステートメントを完了するためのがあります。)

私が正しければ、それらの間にほとんど違いはありません。どちらもSomeObjectコンストラクター関数を作成し、プロトタイプに無名関数を追加します。2番目のバージョンは、コンストラクター関数のプロトタイプを完全に新しいオブジェクト(私はお勧めしません)に置き換えます。最初のバージョンは、コンストラクター関数が既に持っているSomeObjectプロトタイプを拡張するだけです。SomeObject

より便利な形式は次のとおりです。

var SomeObject;
SomeObject = (function() {

    function SomeObject() {
    }

    SomeObject.prototype.doSomething = doSomething;
    function doSomething() {

    }

    SomeObject.prototype.doSomethingElse = doSomethingElse;
    function doSomethingElse()
    }

    return SomeObject;

})();

そこで、割り当てられた名前doSomethingdoSomethingElse持つ関数があります。これは、デバッガーでコードをウォークスルーするときに役立ちます(呼び出しスタック、ブレークポイントのリストなどに表示されます)。すべてをラップする無名関数は、との名前がそれを囲む名前空間を汚染しないようにするためにあります。詳細:匿名匿名doSomethingdoSomethingElse

私たちの何人かはそれをさらに進めます:

var SomeObject;
SomeObject = (function() {
    var p = SomeObject.prototype;

    function SomeObject() {
    }

    p.doSomething = SomeObject$doSomething;
    function SomeObject$doSomething() {

    }

    p.doSomethingElse = SomeObject$doSomethingElse;
    function SomeObject$doSomethingElse()
    }

    return SomeObject;

})();

...そのため、リストだけdoSomethingでなくSomeObject$doSomething、も表示されます。それが邪魔になることもありますが、それはスタイルの選択です。(また、匿名関数を使用して、のエイリアスを囲み、SomeObject.prototype入力を少なくすることに注意してください。)

于 2012-04-19T14:34:05.727 に答える
0

まず、両方のスニペットは私のために解析されません(Chrome)-=の代わりに使用する必要があり:ます。そうは言っても、私の謙虚な意見は次のとおりです。

後者のスニペットは少し奇妙です。なぜなら、実際にSomeObjectは、解析時ではなく、オブジェクト構築時にのプロトタイプでメソッドを定義するからです。したがって、でメソッドを再定義した場合SomeObject.prototype、新しいオブジェクトが作成されると、元のバージョンに戻ります。これにより、このタイプの既存のオブジェクトで予期しない動作が発生する可能性があります。

前者は、(function { ...} ())()ラッパーが不要な場合を除いて、問題なく表示されます。あなたはただ宣言することができます:

function SomeObject() {}
SomeObject.prototype.doSomething = function() {}
SomeObject.prototype.doSomethingElse = function() {}
于 2012-04-19T14:32:40.780 に答える
0

質問の最初と2番目の実際の違いは次のとおりです。

var o = (function () {})();  # call this (A)

var o = function () {};  # call this (B)

残念ながら、あなたが与えた例はどちらも正しく書かれていません。どちらも解析時に実際にエラーになるとは思いませんが、結果を使って何かをしようとすると、どちらも興味深い方法で壊れます。

(A)と(B)の違いについて答えるために、(A)は即時関数適用パターンです。JavaScriptパターンの本には良い議論があります。これをお勧めします。

あなたのコードの実際の問題は、私がこれを書いている間に他の人によって説明されました。特にTJクラウダーは重要なことを指摘しています。

于 2012-04-19T14:36:40.743 に答える