完美"mix-in"(混入)模式———js对象想怎么玩就怎么玩

前两天弄完了继承模式的代码复用  今天上午又心血来潮的回去搞了下 构造函数的模式  领悟很多~  思维不知咋的就飞到了昨天的"mix-in"(混入)模式  始终觉得昨天写的那些混入有些不爽~~~  就是不够完善 = =   今天又拿出来弄了弄   可能说是完美的混入有点问题  就我现在js水平  只能这样了~~~    各位大神 觉得这个有意思的可以给点建议  感激不尽!

我的个人博客: http://www.w3cfuns.com/notes/17383/cb22cf3490b5b461d306b5c62f19c4f5

//完美"mix-in"(混入)模式———js对象想怎么玩就怎么玩
(function () {
	"use strict";

	//完美"mix-in"(混入)模式———自定义拓展对象的属性
	//从多个对象中复制出任意的成员并将这些成员组合成一个新的对象
	function mixDeep(childObj) {

		//要对传入的参数列表进行截取处理 对于添加的属性是复杂类型的数据 也同样采用三元条件操作符
	  	var child = arguments[1] === "[object Object]" ? {} : childObj,	
	  		args = arguments[1] === "[object Object]" ?  [].slice.call(arguments, 0, 1) : [].slice.call(arguments, 1),	
	  		key = null,
	  		curparentKey = null,
	  		i = 0,
	  		len = 0,
	  		arg = 0,
	  		lenArg = 0,
	  		curArgumentsArg = null,
	  		toString = Object.prototype.toString;

	  		//对数据的测试
	  		console.log(arguments[1] + " child is ");
	  		console.log(child);
	  		console.log(childObj);
	  		console.log(args);

	  //	var	args = [].slice.call(arguments, 1);	//处理传入的参数列表  这里会处理两种传参的情况  不符合情况



	  	// console.log(arg + "  "+args.length);
	  	for (arg = 0, lenArg = args.length; arg < lenArg; arg += 1) {
	  		curArgumentsArg = args[arg];
		  	for (key in curArgumentsArg) {
		  		curparentKey = curArgumentsArg[key];
		  		if (curArgumentsArg.hasOwnProperty(key)) {
		  			if (typeof curparentKey !== "object") {		//深拷贝基本数据类型和函数
		  				//console.log(curparentKey);
		  				child[key] = curparentKey;
		  			} else if (toString.apply(curparentKey) === "[object Object]") {	//深拷贝Object类型
		  				//console.log(curArgumentsArg[key]);
		  				child[key] = mixDeep(curArgumentsArg[key], '[object Object]');
		  			} else if (toString.apply(curparentKey) === "[object Array]") {		//深拷贝Array类型
		  				child[key] = [];
		  				for (len = curparentKey.length; i < len; i += 1) {
		  					child[key][i] = curparentKey[i];
		  				}
		  			}
		  		}
		  	} 
		}

		//child 被返回了两次(传入的对象参数有一个Object类型的属性)  如何实现只返回一次 且只是最后一次返回即所有Object类型的深拷贝已经完成后
		return child;
	}


	var objDemo = {
			objName: "objName",
			objAge: 20
		},
		cake = {
			cakeName: "cakeName",
			cakeAge: 20
		};

		cake = mixDeep(
			cake,
			{a: 1, b: 2},
			{name: "demo", age: 19},
			{
				obj: objDemo
			},
			{
				arr: [1, 2, 3],
				fun: function () {
					console.log("this is obj's way");
				}
			}
		);

		cake.obj.objName = "cake";
		console.log(cake.obj.objName);	//cake
		console.log(objDemo.objName);	//objName  说明在拓展扩充后的对象上修改拓展的属性不会影响到引用数据的来源

		//进一步确认属性拓展成功 且拓展的引用属性的修改不会影响到其来源数据
		console.dir(cake);	
		console.dir(objDemo);
}())

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值