2

私は数年間 JavaScript でプログラミングを行ってきましたが、JavaScript でさまざまな手法がどのように機能するかを理解したことがなく、それが機能することだけ..

さて、プロトタイプとコンストラクターがどのように機能するかを適切に学習した後、自分の Web サイト用に独自の (公開されていない) プラグインを作成する前に、jQuery を調べて何かを学びました。

問題は、それがどのように機能するかを理解していないことです。これはほとんど機能するサンプルです: http://jsfiddle.net/3zWvR/1/

(function() {
    test = function(selector) {
        return new test.prototype.init(selector);
    }
    test.prototype = {
        init: function(selector) {
            alert("init ran");
            if (!arguments[0]) {
                return this;
            }
        }
    }
 // As I understand the jQuery code, the next line should really be
 // test.prototype = {
    test.prototype.init.prototype = {
        send: function() {
            alert("send ran");
        }
    }

    window.ob = test;
})()

ob().send();​

jQueryのようにやれば本当にそこにあるはずだと思うものを示す行にコメントしました。しかし、ob.method() を実行できるように複製することはできません...

jQuery の「フレームワーク」またはスケルトンはどのように構築され、どのように機能しますか?

4

1 に答える 1

3

ええと、あなたの質問はとても興味深いもので、jQuery のソース コードを調べ始めて以来、ずっと頭に浮かんできたことです。これを追加すると、コードは希望どおりに機能するはずです。

test.prototype.init.prototype = test.prototype;
test.send = test.prototype.send = function(){
  alert("send ran");
};

これの代わりに:

test.prototype.init.prototype = {
  send: function() {
    alert("send ran");
  }
};

send()おそらく、「オブジェクトとそれ自体のプロトタイプにメソッドを追加しているだけだ」と言っているかもしれませんが、testこの方法で行うと、まさにあなたが望むことを行っています: make that obob()およびで作成されたすべての変数それvar somevar = ob()は、メソッドを持っているようsend()です。

jQuery のソース コードを見ると、メソッドを使用しextend()て jQuery オブジェクトを拡張しています。いくつかの.extend()呼び出しを見ると、1 つのメソッド/プロパティがオブジェクトにのみ追加されているjQuery.fn場合 (つまり、 の省略形prototype)、jQueryオブジェクトにはそのメソッド/プロパティがないことがわかります。consolejQuery.offと入力すると、 が返されますundefinedが、メソッドoffはオブジェクト内に存在しjQuery.fnます ( jQuery.fn.offconsole と入力すると表示されます)。

考えてみればjQuery、プラグインを作成するときは から始めるjQuery.fn.plugin =ので、 によって作成されたオブジェクトにプラグインを追加しますjQueryが、プラグインは から直接アクセスすることはできませんjQuery

jQuery多くのユーティリティも持つコンストラクターと考えてください。オブジェクトのすべてではなく、$(selector)すべてのメソッドが含まれている場合に返されるオブジェクト。jQuery.fnjQueryjQuery.fn

于 2012-11-21T14:40:19.840 に答える