zepto的extend

2016-08-18

Zepto的extend API

1
2
$.extend(target, [source, [source2, ...]])  ⇒ target
$.extend(true, target, [source, ...]) ⇒ target

参数说明

  • source 需要被复制的对象,可以多个
  • target 为需要被返回的对象,可以为空对象,但不能是null,当target为空时,返回source
  • true 深拷贝

深拷贝

对象 {} ,数组[]: 递归复制,

注意:实际写深拷贝方法时要注意忽略掉一些浏览器原生对象,如:window,document之类的

1
2
3
4
5
6
7
var a = {a1: 1,a2:{a21:21, a22:{a221:221}}};
var copy = $.extend({default: 'value'},a);
var deepCopy = $.extend(true,{default: 'value'},a);

console.log(copy.a2 === a.a2;) // true 此时copy.a2和a.a2为同一个对象

console.log(deepCopy.a2 === a.a2;) // false

源码参考

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

function extend(target, source, deep) {
for (key in source)
if (deep && (isPlainObject(source[key]) || isArray(source[key]))) {
if (isPlainObject(source[key]) && !isPlainObject(target[key]))
target[key] = {}
if (isArray(source[key]) && !isArray(target[key]))
target[key] = []
extend(target[key], source[key], deep)
}
else if (source[key] !== undefined) target[key] = source[key]
}

// Copy all but undefined properties from one or more
// objects to the `target` object.
$.extend = function(target){
var deep, args = slice.call(arguments, 1)
if (typeof target == 'boolean') {
deep = target
target = args.shift()
}
args.forEach(function(arg){ extend(target, arg, deep) })
return target
}