Мне надоело всегда писать такой код:
function shallowExtend(obj1,obj2){
var key;
for ( key in obj2 ) {
if ( obj2.hasOwnProperty(key) === false ) continue;
obj1[key] = obj2[key]
}
}
Или, если я не хочу писать код сам, создайте библиотеку, которая это уже делает. Конечно, на помощь приходит ES6 +, который предоставит нам что-то вроде Object.prototype.extend(obj2...)
илиObject.extend(obj1,obj2...)
Так ES6 + предоставляет такую функциональность? Планируется ли такая функциональность, если ее еще нет? Если не запланировано, то почему бы и нет?
javascript
ecmascript-6
Балуптон
источник
источник
[[Prototype]]
сети? Вы делаете «глубокие» или «мелкие» копии? А как насчет неперечислимых и недоступных для записи свойств? Думаю, мне бы хотелось иметь небольшую библиотечную функцию, которая делает то, что мне нужно, и в большинстве случаев ее все равно можно избежать.Ответы:
Вы сможете выполнить мелкое слияние / расширение / назначение в ES6 с помощью Object.assign:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign
Синтаксис:
где ... sources представляют исходный объект (ы).
Пример:
var obj1 = {name: 'Daisy', age: 30}; var obj2 = {name: 'Casey'}; Object.assign(obj1, obj2); console.log(obj1.name === 'Casey' && obj1.age === 30); // true
источник
let merged = Object.assign({}, source1, source2);
Object.assign
: см. Мой ответ здесьJSON.parse(JSON.stringify(src))
Для этого можно использовать синтаксис распространения объекта :
const merged = {...obj1, ...obj2}
Для массивов оператор распространения уже был частью ES6 (ES2015), но для объектов он был добавлен в спецификацию языка на ES9 (ES2018). Его предложение было включено по умолчанию в таких инструментах, как Babel, задолго до этого.
источник
const ob1 = {foo: 123}; const ob2 = {bar: 234}; const merged = {...ob1, ...ob2}; console.log(merged)
Вывод:{ foo: 123, bar: 234 }
Я знаю, что это немного старая проблема, но самое простое решение в ES2015 / ES6 на самом деле довольно простое, используя Object.assign (),
Надеюсь, это поможет, это также ГЛУБОКОЕ слияние:
/** * Simple is object check. * @param item * @returns {boolean} */ export function isObject(item) { return (item && typeof item === 'object' && !Array.isArray(item) && item !== null); } /** * Deep merge two objects. * @param target * @param source */ export function mergeDeep(target, source) { if (isObject(target) && isObject(source)) { for (const key in source) { if (isObject(source[key])) { if (!target[key]) Object.assign(target, { [key]: {} }); mergeDeep(target[key], source[key]); } else { Object.assign(target, { [key]: source[key] }); } } } return target; }
Пример использования:
mergeDeep(this, { a: { b: { c: 123 } } }); // or const merged = mergeDeep({a: 1}, { b : { c: { d: { e: 12345}}}}); console.dir(merged); // { a: 1, b: { c: { d: [Object] } } }
источник
Добавление в
Object.mixin
настоящее время обсуждается, чтобы обеспечить требуемое поведение. https://mail.mozilla.org/pipermail/es-discuss/2012-De December/027037.htmlХотя его еще нет в черновике ES6, похоже, что он пользуется большой поддержкой, поэтому я думаю, что он скоро появится в черновиках.
источник
.mixin
был сброшен TC39.ES6
Object.assign(o1,o2) ; Object.assign({},o1,o2) ; //safe inheritance var copy=Object.assign({},o1); // clone o1 //------Transform array of objects to one object--- var subjects_assess=[{maths:92},{phy:75},{sport:99}]; Object.assign(...subjects_assess); // {maths:92,phy:75,sport:99}
ES7 или Babel
{...o1,...o2} // inheritance var copy= {...o1};
источник
Может быть, с этим справится
Object.defineProperties
метод ES5 ?например
var a = {name:'fred'}; var b = {age: {value: 37, writeable: true}}; Object.defineProperties(a, b); alert(a.age); // 37
Документация MDN: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/defineProperties
источник
defineProperties
определение собственных свойств. Он не перезаписывает свойства в[[prototype]]
цепочке, а затеняет их.Object.getOwnPropertyDescriptor
для установки свойства, когда это сложное значение, или вы будете копировать по ссылке.