论坛首页 Web前端技术论坛

jQuery源码分析-extend函数

浏览 14451 次
精华帖 (1) :: 良好帖 (0) :: 新手帖 (10) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-07-22  
#  //只有当第一个实参为true时,即需要进行深度拷贝时,执行以下分支 
#     if (typeof target === "boolean") { 

这一句应该只是说判断target类型是否为boolean值。
就算target为false 这个if也是能通过的。

验证:alert(typeof false==='boolean'); 打印true
0 请登录后投票
   发表时间:2010-07-22  
adamed 写道
#  //只有当第一个实参为true时,即需要进行深度拷贝时,执行以下分支 
#     if (typeof target === "boolean") { 

这一句应该只是说判断target类型是否为boolean值。
就算target为false 这个if也是能通过的。

验证:alert(typeof false==='boolean'); 打印true

回ls:
从语义上看起来,这句代码是检查boolean类型的。
但再看看函数的第一句代码:
var target = arguments[0] || {}
当第一个参数为false时,target是{},而不是boolean;
因此,只有当第一个参数为true时才会执行。
所以这个分支也可以改为
if(true === target) {
    //其它代码...
}
0 请登录后投票
   发表时间:2010-07-22  
稍微为楼主补充几句:
#     if (length === i) { 
#         target = this; 
#         --i; 
#     } 

上面的代码,为什么要有这句?楼主的注释意思上是没问题的,关键是为啥要这样写。
在jQuery的API文档上我们可以看到。extend作用是扩展对象,并且有专门一个地方说明可以用来扩展jQuery本身。
比如:
jQuery.extend({
  min: function(a, b) { return a < b ? a : b; },
  max: function(a, b) { return a > b ? a : b; }
});
表示向jQuery中添加2个方法插件。
再比如:
jQuery 代码:
var settings = { validate: false, limit: 5, name: "foo" };
var options = { validate: true, name: "bar" };
jQuery.extend(settings, options);
结果:
settings == { validate: true, limit: 5, name: "bar" }
这里就是拓展普通对象了。

那么如何区分哪个调用是扩展jQuery本身,哪个是扩展普通对象呢?
就看这个if是否为true,如果为true则target=this也就表示拓展jQuery本身。否则就是扩展普通对象
0 请登录后投票
   发表时间:2010-07-22  
adamed 写道
稍微为楼主补充几句:
#     if (length === i) { 
#         target = this; 
#         --i; 
#     } 

上面的代码,为什么要有这句?楼主的注释意思上是没问题的,关键是为啥要这样写。
在jQuery的API文档上我们可以看到。extend作用是扩展对象,并且有专门一个地方说明可以用来扩展jQuery本身。
比如:
jQuery.extend({
  min: function(a, b) { return a < b ? a : b; },
  max: function(a, b) { return a > b ? a : b; }
});
表示向jQuery中添加2个方法插件。
再比如:
jQuery 代码:
var settings = { validate: false, limit: 5, name: "foo" };
var options = { validate: true, name: "bar" };
jQuery.extend(settings, options);
结果:
settings == { validate: true, limit: 5, name: "bar" }
这里就是拓展普通对象了。

那么如何区分哪个调用是扩展jQuery本身,哪个是扩展普通对象呢?
就看这个if是否为true,如果为true则target=this也就表示拓展jQuery本身。否则就是扩展普通对象

这里的确没有注释清楚,有待改善。
谢谢指教。
0 请登录后投票
   发表时间:2010-07-22  
分析得太详细了,期待更多分析
0 请登录后投票
   发表时间:2010-07-26  
感谢楼主的奉献,
分析写得很好,谢谢
0 请登录后投票
   发表时间:2010-12-26  
分析得挺不错的,读懂熟透JQuery的源码,是开发插件的前提。
0 请登录后投票
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics