jquery源码学习(四)—— jquery.extend()
a、jQuery.extend( source )
b、jQuery.extend(destination, source1, source2, source3 ....) c、jQuery.extend(boolean, destination, source1, source2, source3 ....)
以上是jquery的extend实现方法
首先是第一种:传入一个源函数,拓展自己
var Test = function(){};
Test.prototype.extend = function(source){
for(var key in source){
this[key] = source[key]
}
return this;
}
var Myobj = {
name:'qiaoming'
}
var test = new Test();
console.log(test.extend(Myobj))
然后是第二种:传入一个源函数,拓展目标对象
function extend(d,s){
for(var key in s){
d[key] = s[key]
}
}
首先写一个拓展对象的方法
Test.prototype.extend = function(){
var source , destination
if(arguments.length === ){
destination = this;
source = arguments[];
extend(destination,source)
return destination;
}
if(arguments.length > ){
var len = arguments.length;
destination = arguments[];
source = [].splice.call(arguments,,len); for(var i=,l=source.length;i<l;i++){
var s = source[i];
extend(destination,s)
}
return destination;
}
function extend(d,s){
for(var key in s){
d[key] = s[key]
}
}
}
根据参数数量,选择拓展方法
第三种根据第一个参数是否为布尔值,判断是否进行深拷贝
根据第一个参数是否为布尔值进行判断
function extend(d,s,b){
var d = d;
if(b && b===true){
for(var key in s){
var v = s[key];
// 假如v还是object
if(v instanceof Array){
d[key] = extend(d[key] || [] , v , true);
}else if(v instanceof Object){
d[key] = extend(d[key] || {} , v , true);
}else{
d[key] = v;
}
}
}else{
for(var key in s){
var v = s[key];
d[key] = v;
}
}
return d
}
重构extend,拥有第三个参数如果为true就深拷贝
最后的代码如下
Test.prototype.extend = function(){
var source , destination
if(arguments.length === ){
destination = this;
source = arguments[];
extend(destination,source)
}
if(arguments.length > ){
var len,destination,source;
if( arguments[] === true ){
len= arguments.length;
destination = arguments[];
source = [].splice.call(arguments,,len);
for(var i=,l=source.length;i<l;i++){
var s = source[i];
extend(destination,s,true)
}
}else{
var len = arguments.length;
destination = arguments[];
source = [].splice.call(arguments,,len);
for(var i=,l=source.length;i<l;i++){
var s = source[i];
extend(destination,s)
}
}
return destination;
}
function extend(d,s,b){
var d = d;
if(b && b===true){
for(var key in s){
var v = s[key];
// 假如v还是object
if(v instanceof Array){
d[key] = extend(d[key] || [] , v , true);
}else if(v instanceof Object){
d[key] = extend(d[key] || {} , v , true);
}else{
d[key] = v;
}
}
}else{
for(var key in s){
var v = s[key];
d[key] = v;
}
}
return d
}
}
这样我们就可以实现一个对象的深浅拷贝
jquery源码学习(四)—— jquery.extend()的更多相关文章
- jQuery 源码学习 - 02 - jQuery.fn.extend 与 jQuery.extend
参考资料:[深入浅出jQuery]源码浅析--整体架构,备用地址:chokcoco/jQuery-. extend 方法在 jQuery 中是一个很重要的方法.jQuery 内部用它来拓展静态方法或者 ...
- jquery源码学习笔记三:jQuery工厂剖析
jquery源码学习笔记二:jQuery工厂 jquery源码学习笔记一:总体结构 上两篇说过,query的核心是一个jQuery工厂.其代码如下 function( window, noGlobal ...
- jquery源码学习(一)——jquery结构概述以及如何合适的暴露全局变量
jQuery 源码学习是对js的能力提升很有帮助的一个方法,废话不说,我们来开始学习啦 我们学习的源码是jquery-2.0.3已经不支持IE6,7,8了,因为可以少学很多hack和兼容的方法. jq ...
- jQuery源码学习扒一扒jQuery对象初使化
神奇的jQuery可以这样玩jQuery("#id").css()或 jQuery("#id").html() 这么玩jQuery("#id" ...
- jquery 源码学习(四)构造jQuery对象-工具函数
jQuery源码分析-03构造jQuery对象-工具函数,需要的朋友可以参考下. 作者:nuysoft/高云 QQ:47214707 EMail:nuysoft@gmail.com 声明:本文为原 ...
- jQuery源码学习感想
还记得去年(2015)九月份的时候,作为一个大四的学生去参加美团霸面,结果被美团技术总监教育了一番,那次问了我很多jQuery源码的知识点,以前虽然喜欢研究框架,但水平还不足够来研究jQuery源码, ...
- 读艾伦的jQuery的无new构建,疑惑分析——jquery源码学习一
背景: 有心学习jquery源码,苦于自己水平有限,若自己研究,耗时耗力,且读懂之日无期. 所以,网上寻找高手的源码分析.再经过自己思考,整理,验证.以求有所收获. 此篇为读高手艾伦<jQuer ...
- jquery 源码学习(一)
从上边的注释看,jQuery的源码结构相当清晰.条理,不像代码那般晦涩和让人纠结 1. 总体架构 1.1 自调用匿名函数 self-invoking anonymous function 打开jQ ...
- jquery 源码学习(*)
最近在做日志统计程序,发现对方的程序是在Jquery基础上进行开发的,而公司的网站的框架是prototype.而且我也早就想了解一下Jquery源码,故决定研究Jquery源码,模拟它的方法 Jq ...
- 菜鸟的jQuery源码学习笔记(前言)
前言 相信任何一名前端开发人员或者是前端爱好者都对jQuery不陌生.jQuery简单易用,功能强大,特别是拥有良好的浏览器兼容性,大大降低了前端开发的难度,使得前端开发变得“平易近人起来”.自从本人 ...
随机推荐
- Python全栈开发:socket
Socket socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. sock ...
- 小米手机 DELETE_FAILED_INTERNAL_ERROR Error while Installing APKs
手机:小米2s,MIUI 9 7.11.16 开发版 手机已处于开发者模式,启用了USB调试,已使用USB线连接了手机,在Android Studio 工具栏点击 "Run ‘app’(Sh ...
- 廖雪峰Java11多线程编程-3高级concurrent包-6ExecutorService
Java语言内置多线程支持: 创建线程需要操作系统资源(线程资源,栈空间) 频繁创建和销毁线程需要消耗大量时间 如果可以复用一个线程 线程池: 线程池维护若干个线程,处于等待状态 如果有新任务,就分配 ...
- 廖雪峰Java11多线程编程-3高级concurrent包-4Concurrent集合
Concurrent 用ReentrantLock+Condition实现Blocking Queue. Blocking Queue:当一个线程调用getTask()时,该方法内部可能让给线程进入等 ...
- RabbitMQ 五种工作模式
官网介绍:https://www.rabbitmq.com/getstarted.html 五种工作模式的主要特点 简单模式:一个生产者,一个消费者 work模式:一个生产者,多个消费者,每个消费者获 ...
- HTML和css简单日常总结
今天主要学习了两个部分:第一部分html:在w3school学习了一些标签的使用和一些属性和方法,例如一些标签<a>,<h1><h6><from>< ...
- Spring MVC(四)--控制器接受pojo参数
以pojo的方式传递参数适用于参数较多的情况,或者是传递对象的这种情况,比如要创建一个用户,用户有十多个属性,此时就可以通过用户的pojo对象来传参数,需要注意的是前端各字段的名称和pojo对应的属性 ...
- 分布式锁的Redis实现
当我们开始开发项目部署运行时,项目规模不大,只是在一个JVM实例中运行,对同一资源的并发访问用JDK自带的锁机制就可以解决资源同时访问的问题.而随着项目的不断发展,单体应用已经无法满足日益增长的访问需 ...
- CAS客户端配置
1. 导出证书 以上操作会在当前目录产生文件:ssodemo.crt(需要用到的文件请看CAS服务端配置那篇文章) 2. 客户端导入证书 以上操作会在jdk安装目录jre\lib\security下产 ...
- 设置listContrl中指定行的颜色
在MFC中 自己通过手动拖放CListCtrl控件来制作自己的表格: 目的: 将指定item的行更该颜色: 步骤: 1,在窗口中拖放CListCtrl控件, 单击右键 创建控件对象: CListCtr ...