4

出くわしたJavaScriptコードの行について少し混乱しているので、その目的を理解したいと思います。

(function ($, window) {

    var example;

    example = function (a, b, c) {
        return new example.fn.init(a, b, C);
    };

    example.fn = example.prototype = {
        init: function (a, b, c) {
            this.a= a;
            this.b= b;
            this.c= c;
        }    
    };

    example.fn.init.prototype = example.fn; //What does this line accomplish?

    $.example = example;


}(window.jQuery, window));

私が理解しているように、問題の行は、子オブジェクトのプロトタイプをそれ自体に割り当てています。これは、事実上、ベースサンプルオブジェクトのプロトタイプです...なぜこれを実行したいのでしょうか。

4

2 に答える 2

1

jQuery質問のコードサンプルは、jQueryがその(通常はエイリアス化された$)オブジェクトを使用するのと同じ方法で、多目的関数/オブジェクトを実装します。

関数で作成されたオブジェクトは、example()実際にはexample.fn.init()コンストラクターによってインスタンス化されます。exampleのプロトタイプをに割り当てるとexample.fn.init、によって公開されるメンバーexampleが、によってインスタンス化されたオブジェクトによっても公開されるようになりますinit()

jQueryソースの関連部分は次のとおりです。

// Define a local copy of jQuery
jQuery = function( selector, context ) {
    // The jQuery object is actually just the init constructor 'enhanced'
    return new jQuery.fn.init( selector, context, rootjQuery );
}

jQuery.fn = jQuery.prototype = {
    constructor: jQuery,
    init: function( selector, context, rootjQuery ) {
        // Actual implementation of the jQuery() function...
    }
    // Other jQuery.fn methods...
};

// Give the init function the jQuery prototype for later instantiation
jQuery.fn.init.prototype = jQuery.fn;
于 2012-08-21T19:09:06.693 に答える
1

の定義全体example.fnがまったく役に立たないようです。(多分それはjQuery fnオブジェクトを模倣することを目的としていますか?)

著者は、これらの次の呼び出しで同じ結果が得られることを望んでいたようです。

var x = $.example(a, b, c); // Build by function call
var y = new $.example.fn.init(a, b, c); // Build by a constructor call

exampleexample.fn.initは同じプロトタイプを持ち、上記xy定義されたものは同じインターフェースを持ちます。面倒な方法で、IMO。

より単純な構文(自己呼び出しコンストラクターパターンとも呼ばれます)を使用して、関数呼び出しで「コンストラクターのような」動作を強制することができます。

function example(a, b, c) {
    if (!(this instanceof example)) {
        return new example(a, b, c);
    }

    this.a = a;
    this.b = b;
    this.c = c;
}

var x = example(a, b, c); // Constructor invoked by function call
var y = new example(a, b, c); // Constructor invoked explicitly
于 2012-08-21T19:12:52.943 に答える