JQuery_2.1.0_日记 4.29 $.extend

因为在JQuery一切皆JQuery,所以JQuery没有EXT那么恐怖的继承体系,比起EXT的Ext.extends(),$.extend()函数还是很好理解的,只是把一个对象的属性和方法添加到目标对象上.刚出生的JQuery是很弱小的,JQuery源码后面和我们自己扩展都是通过$.extend()函数.

Test_Html

<body>

<div id= "div1">div1</div ><div id= "div2">div2</div >

<span id= "span1">span1</span ><span id= "span2">span2</span ><span id="span3" >span3 </span>

</body>

Test_Script

$.extend(target, src);

target.show();//function[native object]说明this是javascript内建对象构造函数

$.extend(src);

$.show();//function[native object]说明this是javascript内建对象构造函数,JQuery
= function(){};

$.fn.extend(src);

$(‘div‘).show(); //function(selector,
context)

可以看到想扩展JQuery的静态方法和属性就$.extend,想扩展JQuery对象就用$.fn.extend,当然也可以扩展自己的简单js对象.

再看$.extend()源码之前,先看一个深克隆和浅克隆的例子.

浅克隆

var target
= {};

var src
= {copy:{name:‘原始数据‘ }};

$.extend(target, src);

target.copy.name = ‘覆盖数据‘ ;

alert(src.copy.name); //覆盖数据

深克隆

var target
= {};

var src
= {copy:{name:‘原始数据‘ }};

$.extend(true, target, src);

target.copy.name = ‘覆盖数据‘ ;

alert(src.copy.name); //原始数据

$.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 a deep copy situation

//如果第一个参数是boolean类型

//修正参数,将第二个参数作为target

if ( typeof target
=== "boolean" ) {

deep = target;

// skip the boolean and
the target

target = arguments[ i ] || {};

//i++是为了后续 i === length的判断

i++;

}

// Handle case when target is
a string or something (possible in deep copy)

//如果目标既不是对象也不是方法(例如给基本类型扩展属性方法和属性不会报错但是是无用的),修正target为 js对象

if ( typeof target
!== "object" && !jQuery.isFunction(target)
) {

target = {};

}

// extend jQuery itself if only
one argument is passed

//如果只有一个参数,修正对象为JQuery函数或JQuery对象

if (
i === length ) {

target = this ;

//修正target所在位置,后面的都是要添加给target的对象

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

//如果target和copy是同一个对象,略过,防止自己的属性引用了本身对象导致的循环引用,以致GC无法回收

if (
target === copy ) {

continue ;

}

// Recurse
if we‘re merging plain objects or arrays

//如果是deep为true,并且要添加给target的copy为对象获数组

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;

}

}

}

}

// Return the modified object

return target;

};

时间: 2024-11-08 23:21:49

JQuery_2.1.0_日记 4.29 $.extend的相关文章

JQuery_2.1.0_日记 5.2

$.方法 (1)$.merge(first, second) 合并两个数组或类数组,将第二个数组添加到第一个数组的末尾 (2)$.grep(elems, callback, invert) 使用callback对elems进行过滤,如果invert设置为true.则返回保留callback返回值为false的元素数组,如果invert设置为false则返回callback返回值为true的元素数组. Test_Script var arr = ['a' , 'b' , 'c' ] arr = $

JQuery_2.1.0_日记 5.4 Sizzle选择器(二)

(1) whitespace = "[\\x20\\t\\r\\n\\f]"; 匹配css3中空白符. \x20:空格;\t水平制表符(tab);\r\n回车换行\f换页符 (2) characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+" 匹配\后任意字符,字母或数字或-,ascii值非\00-\xa0范围内的字符 (3) identifier = characterEncoding.replace( "

JQuery_2.1.0_日记 2014-5.1

JQuery工具方法. (1)$.isNumeric(obj) 此方法判断传入的对象是否是一个数字或者可以转换为数字. isNumeric: function( obj ) { // parseFloat NaNs numeric-cast false positives (null|true|false|"") // ...but misinterprets leading-number strings, particularly hex literals ("0x...&

JQuery_2.1.0_日记 5.4 Sizzle选择器(一) 正则中那些\\\\和\\

Sizzle中恐怖的正则. 字面量的正则也许还好理解,那么由字符串编译而成的正则呢. \\和\\\\ 由字符'\\\\'编译而成的正则是/\\/,第一个\转义第两个\,所以其匹配一个\字符(这个\字符是代表字符本身) Test_Script var s = '\\' ; alert(s); // '\' var rs = '\\\\' ; var matches = s.match(new RegExp(rs)); alert(matches[0]) // '\' 由字符串'\\3'编译而成的正

JQuery_2.1.0_日记 5.5 Sizzle选择器(三)

function Sizzle( selector, context, results, seed ) { var match, elem, m, nodeType, // QSA vars i, groups, old, nid, newContext, newSelector; if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { setDocument( context );

JQuery_2.1.0_日记 5.8 Sizzle选择器(四)

Sizzle( selector, context, results, seed )的关键步骤 1,传入的context对应的context和当前document是否一致,不一致调用setDocument()重新设置document,用于frame的情况. 2,如果context为空修正context为document 3,selector如果不是字符串或者context不是Element或Document直接返回空数组. 4,如果文档是HTML并且未传入过滤结果集seed,尝试用原生方法get

JQuery日记 2014-04.29

JQuery原型对象(续) (4).each(callback,args) 迭代JQuery对象上的元素并调用callback参数,如果某次迭代中callback返回false,停止迭代.args为callback的参数,args必须为数组.在callback中this引用的当前迭代的元素. Test_HTML <body> <div id= "div1">div1</div ><div id= "div2">div2

pc2日记——有惊无险的第二天2014/08/29

今天下午如期的用pc2进行了第二场比赛.因为昨天的出错经历和早上充足的准备,下午的比赛尽管在開始的时候出了点小小的问题,但总的来说还是非常成功的. 早上八点过去504開始又一次配置client,由于开机清理程序的问题.我昨天弄的东西部分被清了.所以我今天得彻底的配置一下: 除了配置pc2client必要的ip和及快捷方式外.还得把清理程序改动一下.这样下次重新启动就不用再又一次配置了:本来昨晚打算用网络同传的,可是同传的是全部数据,显示要十几个小时.坑爹!还不如一台一台的弄呢! 于是,一个人忙活

AC日记——ISBN号码 openjudge 1.7 29

29:ISBN号码 总时间限制:  1000ms 内存限制:  65536kB 描述 每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括9位数字.1位识别码和3位分隔符,其规定格式如“x-xxx-xxxxx-x”,其中符号“-”是分隔符(键盘上的减号),最后一位是识别码,例如0-670-82162-4就是一个标准的ISBN码.ISBN码的首位数字表示书籍的出版语言,例如0代表英语:第一个分隔符“-”之后的三位数字代表出版社,例如670代表维京出版社:第二个分隔之后的五位数字代表该书