Js封装extend方法

<script type="text/javascript">
		//$.extend
		//eg:var obj1={};var obj2={name:'张三'};var obj3={gender:'男'}
		//eg:  $.extend(obj1,obj2,obj3);将obj2与obj3一一遍历添加到obj1
		
		(function(global){
			function jquery(selectors){
				return new jquery.fn.init(selectors);
			}
			jquery.fn=jquery.prototype={
				constructor:jquery,
				init:function(selectors){
					var elements=document.querySelectorAll(selectors);
					for(var i=0;i<elements.length;i++){
							this[i]=elements[i];//给this创建属性从0开始的i
						}	
					this.length=elements.length;
				},
				css:function(name,value){
					for(var i=0;i<this.length;i++){
					this[i].style[name]=value;
					}
				}
			}
			//重点:为了让init实例对象访问到css方法
			jquery.fn.init.prototype=jquery.fn;
			
			jquery.extend=function(...args){
				//args是一个数组[{},{}],每一个参数是一个对象
				console.log(...args);//因为传入的参数是未知的,所以选择对象拓展运算符;
				for(var i=1;i<args.length;i++){
					var objs=args[i];
					for(var key in objs){
						args[0][key]=objs[key];
					}
				}
				return args[0];
			}
			//给window对象添加属性$和jquery,并设置值为jquery
			window.$=window.jquery=jquery;
		})(window)
		
	var obj1={};
	$.extend(obj1,{name:2,age:10},{tall:180})
//	console.log(obj1);//{name:2,age:10,tall:180}
	</script>

方法二:$.fn.extend
也是编写jquery插件的核心
写法如下:

//$.fn.extend({
				//方法一:
				//方法二:
				//方法n:
			//})
	//目的是将   方法添加到jquery原型中
			//jquery.fn.extend赋值为jquery.extend
			//两者区别:1接收数据的对象不同 
			//			jquery.fn.extend:this
			//			jquery.extend:第一个实参
			//       2.提供数据的对象发生变化
			//			jquery.fn.extend:目标参数
			//			jquery.extend:第二个参数及其后面的参数
			jquery.fn.extend=jquery.extend=function(...args){
				var target={};
				var source=[];
				 if(this===jquery){
				 	//$.extend
				 	target=args[0];//target={}
//				 	console.log(args[0])
				 	source=[...args];//[{},{},{}]
				 	source.splice(0,1);
				 }else{
				 	//$.fn.extend
				 	target=this;
				 	source=[...args];
				 }
				 //遍历源,将源赋给target
				 source.forEach((item,index)=>{
				 	//es5中,获取对象(item)中的每一个属性,返回一个数组,由属性组成的数组
				 	Object.keys(item).forEach(items=>{
				 		target[items]=item[items];
				 	})
				 })
				 return target;
			}

优化3

jquery.fn.extend=jquery.extend=function(...args){
				var target={};
				var source=[];
				 if(this===jquery){
				 	//$.extend
				 	target=args[0];//target={}
//				 	console.log(args[0])
				 	source=[...args];//[{},{},{}]
				 	source.splice(0,1);
				 }else{
				 	//$.fn.extend
				 	target=this;
				 	source=[...args];
				 }
				 //遍历源,将源赋给target
				 //source.forEach((item,index)=>{
				 	//es5中,获取对象(item)中的每一个属性,返回一个数组,由属性组成的数组
				 	//Object.keys(item).forEach(items=>{
				 		//target[items]=item[items];
				 	})
				 })
				 //Object.assign(target,source[0],source[1],source[2])
				 Object.assign(target,...source)
				 return target;
			}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值