36

例として、jQuery 1.2.6 からコピー:

jQuery.fn = jQuery.prototype = {
    init: function( selector, context ) {
        // Make sure that a selection was provided
        selector = selector || document;
        ..........
    },
};

ここで JavaScript のような投稿をいくつか読みました: What are .extend and .prototype used for? プロトタイプをサブクラスで使用して、いくつかのメソッドを拡張できることを知っています。

しかし、jQuery からの上記のスニペットの使用法を理解できません。

プロトタイプを説明する正規のドキュメントはありますか?

ありがとう。

4

1 に答える 1

61

すべてのオブジェクトにはprototypeプロパティがあります。これは、他のオブジェクトがプロパティを継承できる単なるオブジェクトです。投稿したスニペットは、いくつかのプロパティ ( などinit) を持つオブジェクトをprototypeofに割り当てるだけjQueryで、エイリアスは短くて入力しやすいためjQuery.prototypeですjQuery.fnfnjQuery を一時的に忘れてしまった場合は、次の簡単な例を検討してください。

function Person(name) {
    this.name = name;
}
Person.prototype.sayHello = function () {
    alert(this.name + " says hello");
};

var james = new Person("James");
james.sayHello(); // Alerts "James says hello"

この例でPersonは、 はコンストラクター関数です。オペレーターで呼び出すことでインスタンス化できます。newコンストラクター内では、thisキーワードはインスタンスを参照するため、すべてのインスタンスに独自のnameプロパティがあります。

はすべてのインスタンス間prototypePerson共有されます。したがって、 のすべてのインスタンスにPersonは、から継承するsayHelloメソッドがあります。メソッドを のプロパティとして定義することで、メモリを節約しています。メソッドの独自のコピーのすべてのインスタンスを(コンストラクター内に割り当てることによって) 簡単に与えることもできますが、それはそれほど効率的ではありません。Person.prototypesayHelloPerson.prototypePersonthis.sayHello

jQuery では、$メソッドを呼び出すと、実際には次のインスタンスが作成されますjQuery.prototype.init(覚えておいてjQuery.fn === jQuery.prototypeください)。

return new jQuery.fn.init(selector, context, rootjQuery);

そして、あなたが見ればjQuery.fn.init

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

実際には、 でjQuery宣言されているすべてのメソッドにアクセスできるのインスタンスを作成していますjQuery.prototype。前に説明したように、これは の各インスタンスでこれらのメソッドを宣言するよりもはるかに効率的ですjQuery

于 2012-10-30T14:01:25.903 に答える