Короткий ответ
Использование, set
а не запись отдельных назначений, таких как ваш второй фрагмент кода, является вопросом удобства. Это позволяет нам написать конфигурацию, не беспокоясь о несущественных подробностях о том, как Karma создает исходный объект конфигурации.
объяснение
Если вы посмотрите на источник , вы увидите реализацию метода: this.set = function (newConfig) { _.merge(config, newConfig, function (obj, src) { // Overwrite arrays to keep consistent with #283 if (_.isArray(src)) { return src } }) }
merge
Он использует merge
метод Лодаша . (Обратите внимание, что это было config.set(otherConfig)
изменено в Lodash 4.x и более. На момент написания статьи Karma ограничивает установку Lodash, которую он использует, чтобы быть в серии 3.x.)
merge
Метод делает это так , что при вызове config
он сочетает в себе разумно значения config
и otherConfig
. Это вопрос удобства. Вы можете написать config.foo.bar = something
для каждого значения, если хотите, но тогда вам придется беспокоиться о том, имеют ли значения, которые вы устанавливаете, по умолчанию или нет.
Например, если я это сделаю, мне не нужно беспокоиться о том, client
что уже определено и какие ключи могут существовать на нем:
config.set({
client: {
captureConsole: false,
},
});
Конечным результатом является то, что я отключен captureConsole
от true
значения по умолчанию, а остальная часть параметра client
конфигурации остается по умолчанию. Если я наивно сделал это:
config.client = {
captureConsole: false,
};
Я бы удалял другие значения, которые установлены config.client
по умолчанию (например useIframe
, clearContext
и т. Д.). Конечно, я мог бы сделать это:
config.client.captureConsole = false;
И это сработало бы: другие значения, определенные на config.client
, останутся нетронутыми. Однако объект конфигурации по умолчанию, созданный Karma, не имеет значений, определенных для всех возможных параметров, которые вы можете установить. Например, если бы я сделал:
config.customPreprocessors.babelModule = { ... };
Я столкнулся с ошибкой, потому что для значения по умолчанию нет customPreprocessors
. Я должен был бы сделать это вместо этого:
config.customPreprocessors = {
babelModule: { ... },
};
Использование config.set
позволяет нам не беспокоиться об этих деталях:
config.set({
client: {
captureConsole: false,
},
customPreprocessor: {
babelModule: { ... },
},
});