5

わかった!まず第一に、この質問は、jQueryの世界を深く掘り下げている(そしておそらく迷子になっている)男性から来ています。

私の研究では、jqueryのメインパターンが次のようなものであることがわかりました(必要に応じて修正することをお勧めします)。

(function (window, undefined) {

   jQuery = function (arg) {
      // The jQuery object is actually just the init constructor 'enhanced'
      return new jQuery.fn.init(arg);
   },
   jQuery.fn = jQuery.prototype = {
      constructor: jQuery,
      init: function (selector, context, rootjQuery) {
         // get the selected DOM el.
         // and returns an array
      },
      method: function () {
         doSomeThing();
         return this;
      },
      method2: function () {
         doSomeThing();
         return this;,
         method3: function () {
            doSomeThing();
            return this;
         };

         jQuery.fn.init.prototype = jQuery.fn;

         jQuery.extend = jQuery.fn.extend = function () {

            //defines the extend method 
         };
         // extends the jQuery function and adds some static methods 
         jQuery.extend({
            method: function () {}

         })

      })

$開始するとjQuery.prototype.init、要素の配列を開始して返します。.cssしかし、やなどのjQueryメソッドがどのように追加されるのか理解できませんでした.hide。この配列に。

静的メソッドを取得します。しかし、それらすべてのメソッドで、どのように返されるか、要素の配列を取得できませんでした。

4

2 に答える 2

8

私もそのパターンが好きではありません。それらには、initすべてのjQueryインスタンスのコンストラクターである関数があります。jQuery関数自体は、次のオブジェクト作成のラッパーにすぎませんnew

function jQuery(…) { return new init(…); }

次に、それらのインスタンスのメソッドをinit.prototypeオブジェクトに追加します。このオブジェクトは、でインターフェイスとして公開されますjQuery.fn。また、prototypejQuery関数のプロパティをそのオブジェクトに設定します-プロパティを使用しない人のためにfn。今、あなたは持っています

jQuery.prototype = jQuery.fn = […]init.prototype

しかし、彼らは2つの[奇妙な]こともします。

  • constructorプロトタイプオブジェクトのプロパティを上書きし、jQuery関数に設定します
  • init関数を公開するjQuery.fn-独自のプロトタイプ。これにより、 $。fn.init関数を拡張できる可能性がありますが、非常に混乱します。

I think they need/want to do all this to be fool-proof, but their code is a mess - starting with that object literal and assigning the init prototype things afterwards.

于 2012-08-27T14:20:13.243 に答える
3

APIをメソッドの外部コレクションと見なし、jQuery関数をラッパーと考えると、簡単に理解できます。

基本的に次のように構成されています。

function a() { return new b();}
a.prototype.method = function() { return this; }
function b() {}
b.prototype = a.prototype;

それを除いて、aです。jQuerybjQuery.prototype.init

ResigがAPIコンストラクターをinitプロトタイプに配置する理由があったと確信していますが、私にはわかりません。ベルギが言及したもの以外に、さらにいくつかの奇妙な点があります。

1)パターンには、からjQuery.fn.init.prototypeへの参照コピーが必要です。これjQuery.prototypeにより、奇妙な無限ループが可能になります。

var $body = new $.fn.init.prototype.init.prototype.init.prototype.init('body');

2)すべてのjQueryコレクションは実際にはのインスタンスですjQuery.fn.initが、同じプロトタイプオブジェクトを参照しているため、コレクションがのインスタンスであると「考える」ようになりますjQuery。あなたはこのように同じ魔術をすることができます:

function a(){}
function b(){}
a.prototype = b.prototype;
console.log( new b instanceof a); // true
console.log( new a instanceof b); // true

補足:私は個人的に次のコンストラクターパターンを使用しましたが、奇妙なことなく同様の結果が得られました。

var a = function(arg) {
    if (!(this instanceof a)) {
        return new a(arg);
    }
};
a.prototype.method = function(){ return this; };
于 2012-11-05T18:31:00.097 に答える