9

私はオブジェクト コンストラクターを次のように書く傾向があります。

function Person(name) {
    this.name = name;
}
Person.prototype.greet = function () {
    alert("Hello! My name is " + this.name + ".");
};

いくつかの JavaScript ライブラリとフレームワークが、次のようにコードを追加していることに気付きました。

var Person = (function () {
    function Person(name) {
        this.name = name;
    }
    Person.prototype.greet = function () {
        alert("Hello! My name is " + this.name + ".");
    };
    return Person;
})();

自己実行匿名関数が何を行い、何に使用されるかを知っています。現時点では、コンストラクターとそのプロトタイプを定義するときにこれがどのような利点または利点を提供するかはわかりません。

編集#1:

私はモジュール パターンとその利点を知っており、コーディングでかなり頻繁に使用しています。私のコミュニケーションにおける間違いは、私の最初のコード サンプルがグローバル スコープにあるはずがないことを明確にしていなかったことです。私は常に、すべての外部 JavaScript ファイルを自己実行型の匿名関数でラップして、コードにローカル スコープを適用します。

例えば:

;(function ( window, undefined ) {
    var p = function (name) {
        this.name;
    };
    p.prototype.greet = function () {
        alert("Hello! My name is " + this.name + ".");
    };
    window.Person = window.Person || p;
})(window);

問題は、そのような無名関数内で使用されている 2 番目のコード サンプルに示されているテクニックを見たことです。

例えば:

;(function ( window, undefined ) {
    var p = (function () {
        var q = function (name) {
            this.name = name;
        };
        q.prototype.greet = function () {
            alert("Hello! My name is " + this.name + ".");
        };
        return q;
    })();
    window.Person = window.Person || p;
})(window);

ここで技の意義を腑に落ちない。

4

4 に答える 4

1

それは事実上名前空間ですよね?

于 2012-02-15T22:03:09.453 に答える
1

2 番目の方法であるモジュール パターンは、移植性が高くなります。任意の名前を付けることができることに注意してくださいPerson

最初の方法では、出現するすべての を追跡するPerson必要があり、コンストラクターとプロトタイプを別のプロジェクトにコピーするときに、メソッドの一部を誤って削除しないように注意してください。

2 番目の方法には追加の利点があります。名前空間で定数/メソッド/プロパティを動的に定義するために使用できるローカル/一時/使い捨て変数を使用できます。

于 2012-02-15T22:02:06.770 に答える
0

これは、JavaScriptだけでなく、ブラウザーのさまざまなJavaScriptエンジンがどのように機能するかについての不思議な知識を持っている私の同僚が、このコードのパターンは、使用されるオブジェクトを定義するための不必要で過度に防御的な方法であると私に言った答えです。スコープクリープを可能にする特定のJavaScriptパーサー(彼はOperaのバージョンを具体的に引用)の障害に対処するため。それは確かに合理的な答えのように聞こえます...

于 2012-04-13T16:03:50.473 に答える
0

私は最初の解決策を好みます。コードが少ないほど明確です。

コードを他のライブラリに頻繁にコピーして貼り付ける場合にのみ、2 番目の解決策が適切に表示されますが、これは正当な理由ではないと思います

于 2012-02-15T22:04:41.430 に答える