jQuery的实现原理的模拟代码 -4 重要的扩展函数 extend


Posted in Javascript onAugust 03, 2010

jQuery.fn.extend 提供了一个扩展机制,可以方便我们通过一个或者多个示例对象来扩展某个对象。如果没有指定被扩展的对象,那么将扩展到自己身上。

jQuery.extend 也可以通过 jQuery.fn.extend 使用, 在 jQuery 中使用很多,用来为一个目标对象扩展成员,扩展的成员来自于一系列参考对象。
这样,如果我们需要为 jQuery.fn 扩展成员 removeData,就可以这样进行。

jQuery.fn.extend( 
{ 
removeData: function( key ) { 
return this.each(function() { 
jQuery.removeData( this, key ); 
}); 
} 
} 
);

extend 的源码如下,因为比较简单,所以没有做太多的精简。
/// <reference path="jQuery-core.js" /> 
2 
3 
4 jQuery.extend = jQuery.fn.extend = function () { 
5 // copy reference to target object 
6 var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options, name, src, copy; 
7 
8 // 深拷贝情况,第一个参数为 boolean 类型,那么,表示深拷贝,第二个参数为目标对象 
9 if (typeof target === "boolean") { 
deep = target; 
target = arguments[1] || {}; 
// skip the boolean and the target 
i = 2; 
} 
// 如果目标不是对象也不是函数 
if (typeof target !== "object" && !jQuery.isFunction(target)) { 
target = {}; 
} 
// 如果只有一个参数就是扩展自己 
if (length === i) { 
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 object literal values or arrays 
if (deep && copy && (jQuery.isPlainObject(copy) || jQuery.isArray(copy))) { 
var clone = src && (jQuery.isPlainObject(src) || jQuery.isArray(src)) ? src 
: jQuery.isArray(copy) ? [] : {}; 
// 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; 
} 
} 
} 
} 
// Return the modified object 
return target; 
};
Javascript 相关文章推荐
Javascript面向对象编程(二) 构造函数的继承
Aug 28 Javascript
jquery实现网页的页面平滑滚动效果代码
Nov 02 Javascript
JS 实现倒计时数字时钟效果【附实例代码】
Mar 30 Javascript
js继承实现方法详解
Dec 16 Javascript
js数组去重的hash方法
Dec 22 Javascript
ES6中Iterator与for..of..遍历用法分析
Mar 31 Javascript
详解vuex 中的 state 在组件中如何监听
May 23 Javascript
纯JS实现简单的日历
Jun 26 Javascript
React Native仿美团下拉菜单的实例代码
Aug 08 Javascript
解决vue2.0 element-ui中el-upload的before-upload方法返回false时submit()不生效问题
Aug 24 Javascript
详解关于Vue版本不匹配问题(Vue packages version mismatch)
Sep 17 Javascript
Openlayers实现距离面积测量
Sep 28 Javascript
jQuery的实现原理的模拟代码 -3 事件处理
Aug 03 #Javascript
SlideView 图片滑动(扩展/收缩)展示效果
Aug 01 #Javascript
JavaScript和ActionScript的交互实现代码
Aug 01 #Javascript
JavaScript判断窗口是否最小化的代码(跨浏览器)
Aug 01 #Javascript
jquery下onpropertychange事件的绑定方法
Aug 01 #Javascript
关于this和self的使用说明
Aug 01 #Javascript
ajax 缓存 问题 requestheader
Aug 01 #Javascript
You might like
海贼王动画变成“真人”后,凯多神还原,雷利太帅了!
2020/04/09 日漫
php微信开发之上传临时素材
2016/06/24 PHP
PHP用户管理中常用接口调用实例及解析(含源码)
2017/03/09 PHP
PHP和MYSQL实现分页导航思路详解
2017/04/11 PHP
PHP模糊查询技术实例分析【附源码下载】
2019/03/07 PHP
Nigma vs Alliance BO5 第五场2.14
2021/03/10 DOTA
js DOM模型操作
2009/12/28 Javascript
jQueryUI的Dialog的简单封装
2010/06/07 Javascript
JS代码放在head和body中的区别分析
2011/12/01 Javascript
无缝滚动改进版支持上下左右滚动(封装成函数)
2012/12/04 Javascript
js获取网页高度(详细整理)
2012/12/28 Javascript
javascript学习笔记(八)正则表达式
2014/10/08 Javascript
前端 Vue.js 和 MVVM 详细介绍
2016/12/29 Javascript
ionic2 tabs使用 Modal底部tab弹出框
2016/12/30 Javascript
微信小程序-小说阅读小程序实例(demo)
2017/01/12 Javascript
Node.js如何使用Diffie-Hellman密钥交换算法详解
2017/09/05 Javascript
ES6与CommonJS中的模块处理的区别
2018/06/13 Javascript
[02:30]DOTA2放量测试专访海涛:呼吁保护新手玩家
2013/08/26 DOTA
[02:19]DOTA2上海特级锦标赛 观赛指南 Spectator Guide
2016/02/04 DOTA
python使用range函数计算一组数和的方法
2015/05/07 Python
TensorFlow 模型载入方法汇总(小结)
2018/06/19 Python
Pandas透视表(pivot_table)详解
2019/07/22 Python
Python多继承以及MRO顺序的使用
2019/11/11 Python
TensorFlow实现指数衰减学习率的方法
2020/02/05 Python
python实现将range()函数生成的数字存储在一个列表中
2020/04/02 Python
Python 实现一个计时器
2020/07/28 Python
Python发送邮件实现基础解析
2020/08/14 Python
Fairyseason:为个人和批发商提供女装和配件
2017/03/01 全球购物
Harrods英国:世界领先的奢侈品百货商店
2020/09/23 全球购物
请解释接口的显式实现有什么意义
2012/05/26 面试题
影子教师研修方案
2014/06/14 职场文书
2014年9.18纪念日演讲稿
2014/09/14 职场文书
公司保洁员岗位职责
2015/02/13 职场文书
工程进度款催款函
2015/06/24 职场文书
使用@Value值注入及配置文件组件扫描
2021/07/09 Java/Android
tomcat默认最大连接数及相关调整方法
2022/05/06 Servers