2017-01-16 1 views
1

Я хотел бы знать, возможно ли изменить атрибуты объекта, переданного функции, не изменяя состояние объекта.Как манипулировать атрибутами объекта, переданного функции без изменения состояния

Что-то вроде этого:

function startOfLine(options) { 
    options.someProp = += 'startOfLine'; 
    return options; 
} 

function otherFunction(options) { 
    // do something with options and... 
    return options; 
} 

const options = startOfLine(otherFunction({ 
    somePro: '', 
    someProp2: '' 
})); 

Я собираюсь создать выполнение функций в динамике, поэтому я не беспокоиться о вложенности 20 уровней вызовов.

Спасибо.

+1

В чем разница между «изменение» и «мутировать» для вас? Вы вряд ли сможете сделать это без другого. Если вы хотите неизменность, вам нужно создать новый объект (с состоянием nes) и вернуть его. – Bergi

+0

Можно ли измерять производительность создания объекта в каждой функции и мутировать оригинал? –

ответ

2

Если вы хотите обновить объект на функциональных языках, обычный подход заключается в возврате новой клонированной версии объекта с некоторыми изменениями свойств (без изменения исходного объекта). Я не думаю, что есть встроенный способ клонирования объекта в JavaScript, но this post provides a detailed answer. Использование функции clone из этого ответа вы можете написать:

function startOfLine(options) { 
    var newOptions = clone(options); 
    newOptions.someProp = 'startOfLine'; 
    return newOptions; 
} 

Если у вас есть объект o1 и вы пишете var o2 = startOfLine(o1) тогда вы получите обратно на новый объект o2 с startOfLine настройками, но без мутирует o1.

Если вы не мутируете объект в любом месте, вы можете выполнить мелкую копию (и избегать клонирования всего дерева объектов), но все же есть некоторые накладные расходы - но вы получаете хорошие свойства работы с неизменяемыми объектами, которые часто имеют избыточный вес Расходы.

0

К сожалению, у меня недостаточно репутации, чтобы оставить комментарий. Итак, пытаюсь ответить на основе некоторых разумных предположений.

Вы ищете способ связать некоторые операции, связанные с одним объектом, с большей эффективностью, избегая слишком много мутаций или создания новых объектов. Конечный объект должен иметь тот же объект (или копию?) С применяемыми преобразованиями.

Если это тот, который вы ищете, это может быть сделано с хорошей эффективностью памяти, используя хэш-деревья. Вы можете обратиться к библиотеке immutable.js на Facebook

https://facebook.github.io/immutable-js/

Смежные вопросы