この記事では主に jQuery extend() の詳細な説明と簡単な例を紹介します。必要な方はぜひ参考にしてください。
jQuery extend()の詳細な説明と簡単な例
jQueryを使用すると、jQueryの一部の関数が次のように使用されることがわかります:
$.get(); $.post(); $.getJSON();
いくつかの関数は次のように使用されます:
$('p').css(); $('ul').find('li');
一部の関数は次のように使用されます:
$('li').each(callback); $.each(lis,callback);
ここには、ツール メソッドとインスタンス メソッドという 2 つの概念が関係しています。通常、ここで説明するツール メソッドは、コードの最初の部分など、インスタンス化せずに呼び出すことができる関数を指します。インスタンス メソッドは、コードの 2 番目の部分など、オブジェクトがインスタンス化された後にのみ呼び出すことができる関数です。 jQuery の多くのメソッドはインスタンス メソッドとツール メソッドの両方ですが、3 番目のコードのように呼び出しメソッドが少し異なります。 JavaScript のツールメソッドとインスタンスメソッドをよりわかりやすく説明するために、次のテストを実行します。
functionA(){ } A.prototype.fun_p=function(){console.log("prototpye");}; A.fun_c=function(){console.log("constructor");}; var a=new A(); A.fun_p();//A.fun_p is not a function A.fun_c();//constructor a.fun_p();//prototpye a.fun_c();//a.fun_c is not a function
上記のテストから、インスタンス メソッドはプロトタイプで定義されており、ツール メソッドはコンストラクターで直接追加されていると結論付けることができます。また、同様に、インスタンス メソッドはコンストラクターによって呼び出すことはできません。インスタンスからツール メソッドを呼び出すことはできません。
もちろんインスタンスメソッドはプロトタイプで定義できるだけではなく、以下の3つの定義方法があります:
functionA(){ this.fun_f=function(){ console.log("Iam in the constructor"); }; } A.prototype.fun_p=function(){ console.log("Iam in the prototype"); }; var a=newA(); a.fun_f();//Iam in the constructor a.fun_i=function(){ console.log("Iam in the instance"); }; a.fun_i();//Iam in the instance a.fun_p();//Iam in the prototype
これら3つのメソッドの優先順位は以下の通りです: インスタンス上で直接定義された変数は、インスタンスに直接定義された変数よりも優先されます。 「this」で定義されており、「this」で定義されている変数は、プロトタイプで定義されている変数よりも上位です。つまり、インスタンス上で直接定義された変数は、「this」およびプロトタイプで定義された変数を上書きし、「this」で定義された変数は、プロトタイプで定義された変数を上書きします。
以下の jQuery の extend() メソッドのソース コードを見てください:
jQuery.extend = jQuery.fn.extend = function() { var options,name, src, copy, copyIsArray, clone, target= arguments[0] || {}, i =1, length= arguments.length, deep= false; // Handle adeep copy situation if ( typeoftarget === "boolean" ) { deep= target; //Skip the boolean and the target target= arguments[ i ] || {}; i++; } // Handlecase when target is a string or something (possible in deep copy) if ( typeoftarget !== "object" && !jQuery.isFunction(target) ) { target= {}; } // ExtendjQuery itself if only one argument is passed if ( i ===length ) { target= this; i--; } for ( ; i< length; i++ ) { //Only deal with non-null/undefined values if ((options = arguments[ i ]) != null ) { //Extend the base object for( name in options ) { src= target[ name ]; copy= options[ name ]; //Prevent never-ending loop if( target === copy ) { continue; } //Recurse if we're merging plain objects or arrays if( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray= jQuery.isArray(copy)) ) ) { if( copyIsArray ) { copyIsArray= false; clone= src && jQuery.isArray(src) ? src : []; }else { clone= src && jQuery.isPlainObject(src) ? src : {}; } //Never move original objects, clone them target[name ] = jQuery.extend( deep, clone, copy ); //Don't bring in undefined values }else if ( copy !== undefined ) { target[name ] = copy; } } } } // Returnthe modified object return target; };
(1) まず、jQuery の extend() メソッドの実装とそのプロトタイプは同じ関数を使用します。
(2) extend()のパラメータが1つだけの場合、jQueryオブジェクトにプラグインが追加されます。 jQuery上で拡張されたものはツールメソッドと呼ばれます。jQuery.fn(jQueryプロトタイプ)で拡張されたものはインスタンスメソッドと呼ばれます。jQueryとプロトタイプ上で同じ名前の関数を拡張した場合でも、jQueryオブジェクトを使用すると、ツールメソッドを使用します。 jQuery() インスタンスメソッドが呼び出されます。
(3) extend()に複数のパラメータがある場合、後続のパラメータは最初のパラメータまで拡張されます。
var a={}; $.extend(a,{name:"hello"},{age:10}); console.log(a);//Object{name: "hello", age: 10}
(4) 浅いコピー (デフォルト):
var a={}; varb={name:"hello"}; $.extend(a,b); console.log(a);//Object{name: "hello"} a.name="hi"; console.log(b);//Object{name: "hello"}
b は a の影響を受けませんが、b の属性の 1 つがオブジェクトの場合:
var a={}; varb={name:{age:10}}; $.extend(a,b); console.log(a.name);//Object{age: 10} a.name.age=20; console.log(b.name);//Object{age: 20}
Due浅いコピーにすると、完了できません。その場合、b.name は a の影響を受けます。このとき、深いコピーを作成したい場合がよくあります。
ディープコピー:
var a={}; varb={name:{age:10}}; $.extend(true,a,b); console.log(a.name);//Object{age: 10} a.name.age=20; console.log(b.name);//Object{age: 10}
b.nameはaの影響を受けません。
var a={name:{job:"Web Develop"}}; var b={name:{age:10}}; $.extend(true,a,b); console.log(a.name);//age: 10 job: "Web Develop"
//b.name没有覆盖a.name.job。
関連する推奨事項:
jQuery での clone() と extend() の比較と使用
以上がjQuery extend()の詳しい説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。