MooTools中`Object.merge(...)`和`Object.append(...)`有什么区别?

时间:2012-09-28 17:26:38

标签: javascript mootools

看起来像一个简单的问题,但这两种方法的MooTools文档看起来完全相同。

以下是文档中的代码:

var firstObj = {
    name: 'John',
    lastName: 'Doe'
};
var secondObj = {
    age: '20',
    sex: 'male',
    lastName: 'Dorian'
};
Object.append(firstObj, secondObj);
//firstObj is now: {name: 'John', lastName: 'Dorian', age: '20', sex: 'male'};

如果我将append更改为merge,我会得到相同的结果。那有什么区别?

1 个答案:

答案 0 :(得分:6)

我能看到的唯一区别是append有两个参数,merge有两个或更多参数。

编辑:

阅读方法的源代码,我看到了另一个区别。 merge方法将克隆其他对象的属性,而append方法仅复制它们。

因此,如果在某些对象中有一个对象或数组作为属性,那么在使用append之后,这些对象或数组将可以从原始对象访问:

var firstObj = {
    name: 'John',
    lastName: [ 'Doe' ]
};
var secondObj = {
    age: '20',
    sex: 'male',
    lastName: [ 'Dorian' ]
};

//Object.merge(firstObj, secondObj);
Object.append(firstObj, secondObj);

console.log(firstObj.lastName[0]); // Dorian

secondObj.lastName[0] = 'McEnroe';

console.log(firstObj.lastName[0]); // McEnroe

如果您使用mergefurstObj.lastName中的数组项在更改secondObj.lastName时不会更改,因为它们不是同一个对象。

小提琴:http://jsfiddle.net/Guffa/PrsXj/

此外,当第二个参数是字符串时,merge方法有一个重载:

merge(obj, "name", obj2)

这只会将属性obj2.name复制到obj,即基本上与merge(obj, { name: obj2.name })相同。