jQuery1.5の新しい特徴subclass-jQueryプラグインメカニズムの救済
3584 ワード
感覚jQuery 1.5最大の変更は2つあり,jQueryサブクラスと非同期キューであり,本稿ではjQueryサブクラスのみについて述べる.
まず、なぜこの機能を発売したのか、基本的にゼロのOO機能を強化したのかを理解しなければなりません.いいえ、次のソースコードからクラスをカスタマイズするのではないことを知っています.しかし、これも愚かな問題です.この方法はsubclassではなくClassと呼ばれています.
プラグインのメカニズムを改善します.
jQueryのプラグインは開発が容易で、そのプロトタイプチェーンに勝手にメソッドを追加することを「プラグイン」と呼ぶため、jQueryのプラグインが多く、ゴミプラグインも多く、更新を停止することでゴミになることも多い.
プラグインの混乱の災いjQueryの流行がますます深刻になるにつれて、jQueryは学びやすくて使いやすくて、会社の先端は人手が足りないので、勝手に楽屋をつかめばいいです.そこでフロントエンドも中国のビル市のようにバブルが発生し、1ページにN個のプラグインを引用し、フルスクリーンのセレクタは、メンテナンスコストが高く、ほぼ不可能である.結局、問題はjQueryとjQueryを汚染していることです.fnという2つのオブジェクトは、以前みんながグローバルな役割ドメインに糞をするのが好きだったように.全局の作用域は公衆便所で、そこに行くのは避けられないが、私たちはサブクラスでjQuery,jQueryを移すことができる.fnの負担.jQuery 1.5では、プラグインをこのように書くべきです.
まず、なぜこの機能を発売したのか、基本的にゼロのOO機能を強化したのかを理解しなければなりません.いいえ、次のソースコードからクラスをカスタマイズするのではないことを知っています.しかし、これも愚かな問題です.この方法はsubclassではなくClassと呼ばれています.
subclass: function(){
function jQuerySubclass( selector, context ) {
return new jQuerySubclass.fn.init( selector, context );
}
jQuerySubclass.superclass = this;
jQuerySubclass.fn = jQuerySubclass.prototype = this();
jQuerySubclass.fn.constructor = jQuerySubclass;
jQuerySubclass.subclass = this.subclass;
jQuerySubclass.fn.init = function init( selector, context ) {
if (context && context instanceof jQuery && !(context instanceof jQuerySubclass)){
context = jQuerySubclass(context);
}
return jQuery.fn.init.call( this, selector, context, rootjQuerySubclass );
};
jQuerySubclass.fn.init.prototype = jQuerySubclass.fn;
var rootjQuerySubclass = jQuerySubclass(document);
return jQuerySubclass;
},
本当の意味はプラグインのメカニズムを改善します.
jQueryのプラグインは開発が容易で、そのプロトタイプチェーンに勝手にメソッドを追加することを「プラグイン」と呼ぶため、jQueryのプラグインが多く、ゴミプラグインも多く、更新を停止することでゴミになることも多い.
jQuery.fn.garbage = function(){
alert(" !")
}
もちろんこれは最も理想的な状況で、プラグインはこんなに簡単です(1つの関数で1つのプラグインを計算するのも多いようです).例えば、プラグインを開発し、同僚も同じ名前のプラグインを開発した場合、問題が発生します.また、(function($){//
$.fn.extend({
a:function(){//
this.b()
},
b:function(){}//
})
})(jQuery);
(function(){//
$.fn.extend({
c:function(){//
this.b()
},
b:function(){}//
})
})(jQuery);
の場合、この2つのプラグインの混用に問題があります.プラグイン1のbとプラグイン2のbは1つのものではないかもしれません.この確率はまだ大きいです.プラグイン1はアメリカの菜鳥開発かもしれません.プラグイン2はドイツの菜鳥開発です.そして、外国人は彼らのプラグインをjQuery公式サイトのプラグイン展示エリアに置くのが好きです.国内の怠け者兼菜鳥は雷を踏みやすい.プラグインの混乱の災いjQueryの流行がますます深刻になるにつれて、jQueryは学びやすくて使いやすくて、会社の先端は人手が足りないので、勝手に楽屋をつかめばいいです.そこでフロントエンドも中国のビル市のようにバブルが発生し、1ページにN個のプラグインを引用し、フルスクリーンのセレクタは、メンテナンスコストが高く、ほぼ不可能である.結局、問題はjQueryとjQueryを汚染していることです.fnという2つのオブジェクトは、以前みんながグローバルな役割ドメインに糞をするのが好きだったように.全局の作用域は公衆便所で、そこに行くのは避けられないが、私たちはサブクラスでjQuery,jQueryを移すことができる.fnの負担.jQuery 1.5では、プラグインをこのように書くべきです.
var MyjQuery = jQuery.subclass();
MyjQuery.fn.writeHello = function(){ this.text('Hello World'); };
MyjQuery('p').writeHello();
MyjQueryはjQueryのサブクラスであるため、そのすべての能力を持ち、チェーン操作と同様に問題ありません.MyjQuery('div').css('border', '1px red solid').writeHello();
私たちはまたjQueryの元の方法を修正することができて、いくつかの隠れたバグのためにソースコードを変更する必要はありません:MyjQuery.fn.text = function(val) {
var orig = jQuery.fn.text;
if(typeof val === "string") {
return orig.call(this, "!!"+ val +"!!");
} else {
return orig.apply(this, arguments);
}
};
MyjQuery('.aaa').text("text");
MyjQuery('.aaa').text(); //!!text!!
// jQuery
jQuery('.aaa).text('text'); //text
もちろんこれも1つの問題をもたらして、プラグインはすべて新しいネーミング空間に縛られて、再びグローバルな役割ドメインの上で糞をします......一歩進んだ救いはそのパッケージのロードメカニズムが出るのを待つようです.そのためプラグインを少なくし、自身のjavascript(jQuery以外)能力を高めることが基本です.