プライベートスコープ/関心の分離を使用して「プラグイン」に追加したい。これは、すべてが 1 つのファイルに組み込まれるか複数のファイルに組み込まれるかに関係なく、プラグイン ベースの Web アプリケーションのメンテナンスと長期的な拡張性にとって重要です。
メソッドを直接アタッチするか、jQuery.fn.foo メソッドのプロトタイプに追加することで、プライベート スコープを作成し、既存の jQuery.fn メソッドを拡張できます。
(function ($) {
// instance method attached to the constructor function
$.fn.myCMS.classOne = function () {
};
// or "shared" method attached to prototype
$.fn.myCMS.prototype.classOne = function() {
};
})(jQuery);
jQuery.extend() を使用できます。これは、この場合、上記の最初のメソッドとしてコンストラクター インスタンスにメソッドを追加するための実際の "省略形" です。オブジェクトに追加するものは何でもカプセル化する必要があります (通常、これは匿名オブジェクトになります)。
$.extend($.fn.myCMS,{ classOne: function () { } });
設計の観点から、同じクロージャー変数を頻繁に取得する必要がある「クラス」がある場合、それらはおそらく同じ関数スコープ/クロージャーの一部である必要があります。または、それらのクロージャー変数のゲッターとセッターを公開する必要があります (おそらく _foo 規則を使用)これは、それらがコードでのみ使用されることを意図していることを示しています)。
(function ($) {
var foo = "foo!";
// combined getter/setter
// could also check arguments.length
$.fn.myCMS._foo = function (value) {
if (typeof(value) != "undefined") {
foo = value;
} else {
return foo;
}
};
)(jQuery);
ハッカーになりたくて、別のスコープからクロージャー変数を取得する必要がある場合は、他のスコープから .call() または .apply() を使用して、これらの新しいメソッドを独自のスコープで実行することで実現できると思います。これがどのように機能するかのサンプルを作成することはできますが、この種のシナリオでスコープ解決がどのように機能するかについて独自の調査を行うことをお勧めします。
with ($.fn.myCMS) { } 構造を使用して、元の「プラグイン」メソッドからスコープを「借りる」ことができると思いますが、私はそれについて 100% 肯定的ではありません。それについて。