jQuery 源码分析4: jQuery.extend
2015-07-23 20:14
555 查看
jQuery.extend是jQuery最重要的方法之一,下面看看jQuery是怎样实现扩展操作的
通过jQuery.extend方法可以为jQuery或其他对象进行属性扩展操作。对于纯对象可选择执行深拷贝,对于数组是一定执行深拷贝。
jQuery的大部分功能都通过此方法进行扩展,也可以此为jQuery扩展插件。
jQuery.extend({}),此时target为 jQuery.prototype,为jQuery扩展静态属性或方法,jQuery内部也是以此方法进行。
jQuery().extend({}),此时target为jQuery对象本身,给jQuery对象扩展属性或方法。
// 如果传入一个对象,这个对象的属性会被添加到jQuery对象中 // 如果传入两个或多个对象,所有对象的属性会被添加到第一个对象中 // 如果想合并两个对象,则可以这样用: $.extend({}, obj1, obj2); // 如果第一个参数是true,则执行深拷贝(迭代合并) jQuery.extend = jQuery.fn.extend = function() { var src, copyIsArray, copy, name, options, clone, target = arguments[0] || {}, // 获取第一个参数,第1个参数选择是否进行深拷贝 i = 1, length = arguments.length, deep = false; // 处理深拷贝 if ( typeof target === "boolean" ) { deep = target; // 跳过第一个boolean值 target = arguments[ i ] || {}; // i == 1 i++; } // 如果target是一个非object且非function (是string或其他类型,可能要深拷贝) if ( typeof target !== "object" && !jQuery.isFunction(target) ) { target = {}; } // 如果只有一个参数,则扩展jQuery对象自己 if ( i === length ) { target = this; i--; } for ( ; i < length; i++ ) { // 只处理非null或undefined的值 if ( (options = arguments[ i ]) != null ) { // 开始扩展基类对象 for ( name in options ) { src = target[ name ]; copy = options[ name ]; // 防止一个环形链,造成循环引用 if ( target === copy ) { continue; } // 如果要执行纯对象的深拷贝或拷贝Array时,要递归jQuery.extend if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { if ( copyIsArray ) { copyIsArray = false; // 确保src是一个数组 clone = src && jQuery.isArray(src) ? src : []; } else { // 确保src是一个纯对象 clone = src && jQuery.isPlainObject(src) ? src : {}; } // 递归调用jQuery.extend来实现深拷贝 target[ name ] = jQuery.extend( deep, clone, copy ); // 丢弃undefined值 } else if ( copy !== undefined ) { // 执行拷贝 target[ name ] = copy; } } } } // 返回扩展后的对象 return target; };
通过jQuery.extend方法可以为jQuery或其他对象进行属性扩展操作。对于纯对象可选择执行深拷贝,对于数组是一定执行深拷贝。
jQuery的大部分功能都通过此方法进行扩展,也可以此为jQuery扩展插件。
jQuery.extend({}),此时target为 jQuery.prototype,为jQuery扩展静态属性或方法,jQuery内部也是以此方法进行。
jQuery().extend({}),此时target为jQuery对象本身,给jQuery对象扩展属性或方法。
相关文章推荐
- 非常简单的使用jquery fancybox插件实现的查看图片效果
- Jquery Validate插件+requireJs库
- flask接受jquery ajax传递过来的参数
- 关于在jquery动态修改css,html中,mouseenter,mouseleave,click等方法失效的处理
- jquery validationengine验证
- jQuery静态方法parseJSON方法使用和源码分析
- jQuery报错:
- jQuery基本方法随笔
- jquery日期格式化
- Jquery Mobile 中绑定事件
- jQuery判断获得的对象是否存在的方法
- jquery easyui树形菜单调用点击事件例子
- js jquery 杂记
- jquery 插件写法笔记
- jquery实现简单的轮换出现效果实例
- jquery实现简单实用的打分程序实例
- 实习小结四:如何使用jQuery实现鼠标移动改变Tab
- 点击页面其它地方隐藏层
- jQuery获取对象
- jQuery 中的事件冒泡和阻止默认行为