Я использовал это расширение:

const extend = require('util')._extend;

Но только что заметил, что он изменяет исходный объект:

> let hello = {a: 5};
> extend(hello, {poop: 'whas'})
{ a: 5, poop: 'whas' }
> hello
{ a: 5, poop: 'whas' }

Какой краткий способ я могу расширить объекты, не изменяя их?

Например. Я хотел бы, чтобы вышеупомянутая сессия repl была похожа на:

> let hello = {a: 5};
> extend(hello, {poop: 'whas'})
{ a: 5, poop: 'whas' }
> hello
{ a: 5 }
1
theonlygusti 4 Мар 2018 в 14:56

4 ответа

Лучший ответ

Использовать Object.create

const extend = require("util")._extend;

let hello = { a: 5 };
let newObj = _extend(Object.create(hello), { poops: 'whas' });

console.log(newObj.a); // a
console.log(newObj.poops);  // whas

console.log(hello.a) // 5
console.log(hello.poops) // undefined
1
0.sh 4 Мар 2018 в 12:10

Object.assign - ваше решение

const object2 = Object.assign({}, object1);
0
Fabien Greard 4 Мар 2018 в 12:00

Пока никто не предоставил решение ES5, позвольте мне дать вам шанс:

function extend(obj1, obj2) {
	if (!window.JSON)
		return false;

	var _res = JSON.stringify(obj1) + JSON.stringify(obj2);

	return JSON.parse(_res.replace('}{', ','));
}

var foo = { 0: 'apple', 1: 'banana', 2: 'peach' };
var bar = { favorite: 'pear', disliked: 'apricot' };

extend(foo, bar); // returns bar
console.log(foo); // { 0: 'apple', 1: 'banana', 2: 'peach' }
console.log(bar); // { 0: 'apple', 1: 'banana', 2: 'peach', favorite: 'pear', disliked: 'apricot' }
0
bukharim96 4 Мар 2018 в 12:30

Кроме того, если вы используете ES9 / ES2018, самое простое решение - просто использовать оператор спреда. Как правило, он все равно компилируется в Object.assign, но это гораздо более аккуратный синтаксис.

let hello = {a: 5}
console.log({ ...hello, foo: 'bar' })  // { a: 5, foo: 'bar' }
console.log(hello)                     // { a: 5 }
0
adomnom 4 Мар 2018 в 12:42