类jquery.extend方法,默认深拷贝。
// es6: extendVue.js
// 拓展合并对象方法、兼容vue
export default extendVue = (target, ...objs)=>{
let isDeep = true;//默认深拷贝
let length = objs.length;//可变参数长度
let i = 0;//索引号
if(typeof target == 'boolean'){
isDeep = target;
if(length){
target = objs[i];
i++;
}else{
return false;//不存在拷贝数据,返回false
}
}
//定义:深拷贝方法
let extendDeep = (target, obj) => {
for(let i in obj) {
if(obj.hasOwnProperty(i)) {
//检测当前属性是否为array/object
if(Object.prototype.toString.call(obj[i])=='[object Array]' || Object.prototype.toString.call(obj[i])=='[object Object]') {
//如果当前属性为对象,还要检测它是否为数组、赋值对象和原对象是否同一类型
if(typeof target[i]!= 'object' || Object.prototype.toString.call(target[i])!=Object.prototype.toString.call(obj[i])){
//防止解除原有对象引用
target[i] = (Object.prototype.toString.call(obj[i]) == '[object Array]') ? [] : {};
}
//递归调用extend
extendDeep(target[i], obj[i]);
} else {
target[i] = obj[i];
}
}
}
return target;
};
let type = Object.prototype.toString.call(target);
if(type=='[object Object]' || type=='[object Array]'){
//判断是否存在合并情况
if(length-i){
for(;i<length;i++){
//拷贝类型不同则跳过
let item = objs[i];
if(Object.prototype.toString.call(item) == type){
if(isDeep){
//深拷贝
extendDeep(target, item);
}else{
//浅拷贝
for(let key in item){
if(item.hasOwnProperty(key)){
target[key] = item[key];
}
}
}
}
}
}else{
return JSON.parse( JSON.stringify(target) );//仅有一个对象,不存在合并,则返回新对象
}
}
return target;
};