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

Sco*_*pey 2 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'};
Run Code Online (Sandbox Code Playgroud)

如果我换appendmerge,我会得到相同的结果.那有什么区别?

Guf*_*ffa 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
Run Code Online (Sandbox Code Playgroud)

如果使用merge,则furstObj.lastName更改时数组项不会更改secondObj.lastName,因为它们不是同一个对象.

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

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

merge(obj, "name", obj2)
Run Code Online (Sandbox Code Playgroud)

这只会复制的属性obj2.nameobj,即基本相同merge(obj, { name: obj2.name }).