Heim >Web-Frontend >js-Tutorial >Erweiterung des jQuery-Objekts --extend

Erweiterung des jQuery-Objekts --extend

迷茫
迷茫Original
2017-01-23 15:09:521499Durchsuche

Jeder, der ein JQuery-Plug-In geschrieben hat, weiß, dass das JQuery-Objekt durch die von JQuery bereitgestellte Erweiterung erweitert werden kann. Diese Methode kann nicht nur das JQuery-Objekt erweitern, sondern einem Objekt auch neue Eigenschaften und Methoden hinzufügen wird später besprochen.

Die Methoden zum Aufrufen von „extend“ sind ebenfalls unterschiedlich:

  • Was durch $.extend() erweitert wird, ist eine statische Methode;

  • Was durch $.fn.extend() erweitert wird, ist die Instanzmethode.
  • Jeder, der jQuery-Plug-ins geschrieben hat, sollte wissen, dass wir oft „extend“ verwenden, um Plug-ins zu jQuery-Objekten hinzuzufügen.

So schreiben Sie das Plug-in:

$.extend() und $.fn.extend() rufen tatsächlich dieselbe Funktion auf. Warum unterscheiden sich die von ihnen implementierten Funktionen? ?
;(function($){
    $.fn.extend({
        Firstplus: function() {}
    });    //这样写的话插件的使用方法就是:$('div').Firstplus();

    $.extend({
        Secondplus: function() {}
    });    //这样写的话插件的使用方法就是:$.Secondplus();})($);

Hauptsächlich, weil diese Methode das eingehende Objekt darauf erweitert.
jQuery.extend = jQuery.fn.extend = function() {}   //源码285行

Dies von $.extend(xx) zeigt auf das jQuery-Objekt. Was zu diesem Zeitpunkt also erweitert wird, ist das jQuery-Objekt, das direkt über $.xx aufgerufen werden kann.

Dies von $.fn.extend(xx) zeigt auf den Prototyp des jQuery-Objekts, sodass der Prototyp des erweiterten jQuery-Objekts zu diesem Zeitpunkt und das instanziierte jQuery-Objekt alle Methoden des jQuyer-Prototyps aufrufen können . Rufen Sie direkt über $().xx auf.

Im Folgenden sind drei verschiedene Verwendungsmöglichkeiten von „extend“ aufgeführt:

1.jQuery.extend( [ object ] )

2.jQuery.extend( target, [ object1 ,... objectN ] )
>将传入的 object 扩展到 this 对象上

3.jQuery.extend( [ deep ], target, [object1,... objectN ] )
>将后面传入的 object1 到 objectN 扩展到 target 对象上

Siehe den Quellcode für Details Analyse:
>如果传入了 deep 参数表示递归后面传入object1到objectN对象然后在扩展到target,这样同名的属性名就不会被覆盖了。

Durch die Erweiterungsfunktion ist ersichtlich, dass die Erweiterungsfunktion viele verschiedene Funktionen durch viele if-Urteile implementiert:
jQuery.extend = jQuery.fn.extend = function() {//定义了一些变量var options, name, src, copy, copyIsArray, clone,
    target = arguments[0] || {},  //target用来存储传入的第一个对象(目标对象)
    //这个target不仅表示要进行合并的目标对象,也可以表示要扩展到jquery上的对象
    i = 1,  //i用来表示target后面传入的对象是arguments的第几个参数
    length = arguments.length,   
    deep = false;  //deep变量表示,是否进行深度拷贝//先进行了一系列的if判断,来初始化参数,判断到底是要扩展jQuery还是对传入的对象进行扩展//如果第一个参数是布尔类型,则表示是否深度拷贝if ( typeof target === "boolean" ) {
    deep = target;
    target = arguments[1] || {};  //将目标对象置为传入的第二个参数,如果没有置为空对象
    // skip the boolean and the target
    i = 2;   //将i置为2}//如果target不是一个对象,将其置为空对象if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
    target = {};
}//如果arguments和i相等,表示要扩展的jquery对象,让target指向this//这个this具体指向什么之前已经探讨过了if ( length === i ) {  
    target = this;
    --i;  //且让i--,这时arguments[i]表示的才是要扩展到jquery上的对象}for ( ; i < length; i++ ) { //开始遍历传入的 arguments
    // 只有参数不为空时才执行后面的操作
    if ( (options = arguments[ i ]) != null ) {        // 对对象进行扩展,无论传入的target对象,还是jQuery对象,都使用同样的方法进行扩展
        for ( name in options ) {  //遍历传入的对象的属性
            src = target[ name ];
            copy = options[ name ];            //防止target和obj的某个属性指向的是同一对象进入死循环
            if ( target === copy ) {  
                continue;
            }            //是否进行深度拷贝
            //这里说的深度拷贝,和我们平时说的深度拷贝有点区别;这里指的当obj的某个属性是一个对象时,是否对这个属性继续遍历,如果不进行遍历的话,会直接覆盖target对象的同名属性
            if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {                if ( copyIsArray ) {  //如果要拷贝的obj属性为数组
                    copyIsArray = false;
                    clone = src && jQuery.isArray(src) ? src : [];

                } else {  //如果要拷贝的obj属性为对象
                    clone = src && jQuery.isPlainObject(src) ? src : {};
                }                // 进行递归,直到属性不再为一个对象或数组
                target[ name ] = jQuery.extend( deep, clone, copy );
            } else if ( copy !== undefined ) {//如果不进行深拷贝且当前obj的属性不为空
                //扩展target对象,且和当前obj属性名相同。
                target[ name ] = copy;
            }
        }
    }
}return target;   最后返回target对象,如果扩展的jquery对象,则返回的就是jquery对象
};

    Mehrere Objekte erweitern zu Auf einem Objekt;
  • Erweitern Sie mehrere Objekte zu einem Objekt und durchlaufen Sie die zu erweiternden Objekte, um zu verhindern, dass Objekte mit demselben Attributnamen überschrieben werden; 🎜>
  • Erweitert ein Objekt zum JQuery-Objekt

  • Erweitert ein Objekt zum JQuery-Prototypobjekt.

  • Sie können später auch sehen, dass jq durch diese Methode viele Tool-Methoden auf jQuery-Objekte erweitert hat. Es muss gesagt werden, dass die Struktur von jq immer noch sehr kompakt ist Nur zur äußerlichen Anwendung vorgesehen, wird auch oft innerlich verwendet

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn