Короткий ответ
Использование, 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: { ... },
},
});