この質問にはいくつかの層があります。1つ目はオブジェクトリテラルです。Javascriptを使用すると、オブジェクトリテラル構文を使用してオブジェクトを宣言できます(文字列に格納/転送される構文であるJSONについて聞いたことがあるかもしれません)。構文は次のとおりです。
var obj = { key1 : "value1", key2 : "value2" };
これを書くためのより構造化された/読みやすい方法は次のとおりです。
var obj = {
key1 : "value1",
key2 : "value2"
};
上記のコードは、次のコードとまったく同じです。
var obj = new Object();
obj.key1 = "value1";
obj.key2 = "value2";
だからあなたが行に見ているもの:
addClass : function () {
オブジェクトリテラル宣言の一部にすぎません。基本的に、コードはこれを実行しています。
var tmp = new Object();
// ...
tmp.addClass = function () { /* ... */ };
// ...
jQuery.fn.extend(tmp).
の呼び出しでオブジェクトリテラルを直接宣言することを除いてextend()
、一時変数を使用する必要はありません。
2つ目は、JavaScriptの関数は特別ではないということです。つまり、関数は他のすべてと同じように扱われます:文字列、数値、配列、オブジェクト。実際、JavaScriptでは、文字列、数値、配列、関数はすべてオブジェクトです。したがって、変数に関数を割り当てることができます。
var n = function () {alert("Hello World");}
したがって、魔法のようなことは何も起こりません。これは、メソッドに引数として渡される関数のコレクションを含むオブジェクトリテラル構文で匿名オブジェクトを作成するだけですextend
。
それが構文の説明です。つまり、JavaScript自体で何が起こっているのかということです。
jQueryコードを見ていることはわかっています。だから、それは私たちに何が起こっているかについてのより多くの手がかりを与えてくれます。まず最初に:jQuery.fn
は単にへのポインタjQuery.prototype
です。そしてjQuery
それ自体がコンストラクターです。javascriptでは、コンストラクターはオブジェクトの作成に使用できる通常の関数です。コンストラクターを使用してオブジェクトを作成すると、そのオブジェクトはコンストラクターのプロトタイプから継承されます。
また、jQueryはそのプロトタイプを変更し、extend
jQueryのプロトタイプに他のメソッドや属性を追加できるメソッドを追加しました。それがやっていることです。前述のオブジェクトリテラルに含まれるすべての関数は、extend
jQuery自体に追加されるメソッドによって処理されるため、新しいjQueryオブジェクトを作成すると、それらは継承されます。
あなたのコメントに基づくと、JavaScriptについて学ぶ必要のあることがたくさんあるようです。Rhinoの本「JavaScript: TheDefinitiveGuide」を読むことをお勧めします。そして、あなたがより多くを知り、javascriptに慣れたら、「Javascript:TheGoodParts 」も読むことをお勧めします。
私はあなたのコメントについてここで私ができる最善のことを答えようとします。すべてを説明するには、1冊の本が必要です。
まず、ラインについて:
jQuery.extend = jQuery.fn.extend = function() {
前に述べたように、jQuery.fn
はへの単なるポインタjQuery.prototype
です。つまり、基本的には次のようになります。
jQuery.prototype.extend = function () { /* ... */ };
jQuery.extend = jQuery.prototype.extend;
2つの違いは何ですか?最初に覚えておく必要があるjQuery
のは、コンストラクターです。コンストラクターによって作成されたオブジェクトは、そのプロトタイプを継承します(javascriptにはクラスがありませんが、「prototype」という単語を「class」に切り替えると、オブジェクトがどのように機能するかを理解できるようになります)。jQuery
したがって、extendの最初の宣言は、オブジェクトのすべてのインスタンスのメソッドとして定義します。
// note: The following is not the recommended way to write jQuery code
// but it does illustrate the point about inheritance:
var foo = new jQuery();
foo.extend(); // this works because foo inherits jQuery's extend method
さて、JavaScriptでは関数もオブジェクトであると言ったことを覚えていますか?2番目の宣言は、jQuery
関数をオブジェクトとして扱い、関数を直接追加します。これは主にシンタックスシュガーです。それはあなたが書くことができるようにするためです:
jQuery.extend();
長い代わりに:
jQuery.prototype.extend();
または次のような複雑なもの:
new jQuery().extend.call(jQuery);
拡張がどのように書かれたかに依存します。
つまり、これjQuery.extend()
は単にjQueryコンストラクター自体のメソッドです。jQueryコンストラクターによって作成されたオブジェクトには継承されません。クラスメソッドと考えてください。