jQuery extend()详解及简单实例


Posted in jQuery onMay 06, 2017

jQuery extend()详解及简单实例

使用jQuery的时候会发现,jQuery中有的函数是这样使用的:

$.get(); 
$.post(); 
$.getJSON();

有些函数是这样使用的:

$('div').css(); 
$('ul').find('li');

有些函数是这样使用的:

$('li').each(callback); 
$.each(lis,callback);

这里涉及到两个概念:工具方法与实例方法。通常我们说的工具方法是指无需实例化就可以调用的函数,如第一段代码;实例方法是必须实例化对象以后才可以调用的函数,如第二段代码。jQuery中很多方法既是实例方法也是工具方法,只是调用方式略有不同,如第三段代码。为了更清晰解释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

通过以上测试可以得出结论,在原型中定义的是实例方法,在构造函数中直接添加的是工具方法;实例方法不能由构造函数调用,同理,工具方法也不能由实例调用。

当然实例方法不仅可以在原型中定义,有以下三种定义方法:

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

这三种方式的优先级为:直接定义在实例上的变量的优先级要高于定义在“this”上的,而定义在“this”上的又高于 prototype定义的变量。即直接定义在实例上的变量会覆盖定义在“this”上和prototype定义的变量,定义在“this”上的会覆盖prototype定义的变量。

下面看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()中只有一个参数的时候,是为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中一个属性为对象:

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}

由于浅拷贝无法完成,则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 相关文章推荐
jquery实现图片平滑滚动详解
Mar 22 jQuery
jQuery自定义图片上传插件实例代码
Apr 04 jQuery
JQueryMiniUI按照时间进行查询的实现方法
Jun 07 jQuery
各种选择框jQuery的选中方法(实例讲解)
Jun 27 jQuery
jQuery:unbind方法的使用详解
Aug 14 jQuery
jQuery ajax读取本地json文件的实例
Oct 31 jQuery
jQuery Datatables表头不对齐的解决办法
Nov 27 jQuery
jQuery实现DIV响应鼠标滑过由下向上展开效果示例【测试可用】
Apr 26 jQuery
jQuery实现的淡入淡出图片轮播效果示例
Aug 29 jQuery
jQuery对底部导航进行跳转并高亮显示的实例代码
Apr 23 jQuery
详解jQuery如何实现模糊搜索
May 10 jQuery
jquery实现购物车基本功能
Oct 25 jQuery
jquery仿微信聊天界面
May 06 #jQuery
简单实现jQuery弹幕效果
May 06 #jQuery
jquery实现提示语淡入效果
May 05 #jQuery
Jquery获取radio选中的值
May 05 #jQuery
jQuery实现简单的抽奖游戏
May 05 #jQuery
jquery中each循环的简单回滚操作
May 05 #jQuery
jquery dataTable 获取某行数据
May 05 #jQuery
You might like
在PHP3中实现SESSION的功能(三)
2006/10/09 PHP
PHP开发的一些注意点总结
2010/10/12 PHP
不重新编译PHP为php增加openssl模块的方法
2011/06/14 PHP
php使用date和strtotime函数输出指定日期的方法
2014/11/14 PHP
PHP中的命名空间相关概念浅析
2015/01/22 PHP
基于PHP常用文件函数和目录函数整理
2017/08/17 PHP
PHP调用全国天气预报数据接口查询天气示例
2019/02/20 PHP
PHP简单验证码功能机制实例详解
2019/03/27 PHP
php-fpm重启导致的程序执行中断问题详解
2019/04/29 PHP
CheckBox 如何实现全选?
2006/06/23 Javascript
jQuery中fadeIn、fadeOut、fadeTo的使用方法(图片显示与隐藏)
2013/05/08 Javascript
JS计算网页停留时间代码
2014/04/28 Javascript
jQuery判断元素上是否绑定了指定事件的方法
2015/03/17 Javascript
JavaScript函数的调用以及参数传递
2015/10/21 Javascript
基于jQuey实现鼠标滑过变色(整行变色)
2015/12/07 Javascript
JS动态给对象添加属性和值的实现方法
2016/10/21 Javascript
JavaScript中立即执行函数实例详解
2017/11/04 Javascript
使用jQuery mobile NuGet让你的网站在移动设备上同样精彩
2019/06/18 jQuery
JavaScript面向对象中接口实现方法详解
2019/07/24 Javascript
node删除、复制文件或文件夹示例代码
2019/08/13 Javascript
JavaScript 严格模式(use strict)用法实例分析
2020/03/04 Javascript
浅谈Python数据类型之间的转换
2016/06/08 Python
用pycharm开发django项目示例代码
2019/06/13 Python
Python计算公交发车时间的完整代码
2020/02/12 Python
python3 配置logging日志类的操作
2020/04/08 Python
python3实现名片管理系统(控制台版)
2020/11/29 Python
纽约复古灵感的现代珠宝品牌:Lulu Frost
2018/03/03 全球购物
豪华床上用品、床单和浴室必需品:Peacock Alley
2019/09/04 全球购物
extern在函数声明中是什么意思
2014/01/19 面试题
函授本科自我鉴定
2013/11/03 职场文书
2014年两会学习心得范例
2014/03/17 职场文书
企业厂务公开实施方案
2014/03/26 职场文书
公司委托书格式范文
2014/04/04 职场文书
学校领导干部民主生活会整改方案
2014/09/29 职场文书
2015年学生会部门工作总结
2015/04/21 职场文书
青年岗位能手事迹材料(2016推荐版)
2016/03/01 职场文书