前两天弄完了继承模式的代码复用 今天上午又心血来潮的回去搞了下 构造函数的模式 领悟很多~ 思维不知咋的就飞到了昨天的"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);
}())