В ES2015+

Если вы давно работаете с JS, то знаете, что объекты передаются по ссылке. При этом частенько в работе есть необходимость в расширении, клонировании и слиянии объектов. Порой ради таких задач в проект тянут библиотеки jQuery, Underscore/Lo-dash и им подобные.

Раньше для клонирования только полей использовалась техника сериализации-десереализации через JSON. Выглядело это так:

var src = { a: 1, b: 2, f: function(){}, c: [1,2,3], o: {x:1,y:2} }
var dest = JSON.parse( JSON.stringify(src) );
console.log(dest);

Не очень эффективно, не копирует методы, но для полей вполне рабочий вариант.

Но у нас на дворе 2016 год подходит к концу, в 2016 году такие задачи решаются на ES2015+ не так уж и сложно.

Object.assign

Если вам нужно расширить объект, то вы смело можете использовать Object.assign для этих целей:

class Point {
constructor(x, y) {
Object.assign(this, { x, y });
}
}
let o = new Point(1,1);
console.log(o);

Еще один пример копирования:

let src1 = { a: 'a', b: 'b', c: 'c'}
let src2 = { a: 1, foo: { x: 1, y: 2, src1, f:f=>f } };
let src3 = { b: 2, bar: { s: 'abc', src1 } };
let dest = Object.assign({}, src2, src3);
console.dir(dest);

Если вам нужно склонировать объект, так же для этих целей используется Object.assign:

let dest = Object.assign({ __proto__: source.__proto__ }, source);

Spread оператор

Если вы используете Babel или TypeScript, вы можете слить объекты через оператор расширения:

let src1 = { a: 'a', b: 'b', c: 'c'}
let src2 = { a: 1, foo: { x: 1, y: 2, src1, f:f=>f } };
let src3 = { b: 2, bar: { s: 'abc', src1 } };
let dest = { ...src2, ...src3 };
console.dir(dest);

Кстати, просто клонировать объект так же можно через spread:

let obj = { foo: 123, bar: 'abc'}
let copy = { ...obj }

В обозримом будущем это можно будет провернуть прямо в браузере без транспайлеров.

И вам не нужно ставить специальных библиотек дополнительно.