In my opinion, utilizing Object.freeze
allows for a DRYer and more declarative style. My preferred pattern is:
./lib/constants.js
module.exports = Object.freeze({
MY_CONSTANT: 'some value',
ANOTHER_CONSTANT: 'another value'
});
./lib/some-module.js
var constants = require('./constants');
console.log(constants.MY_CONSTANT); // 'some value'
constants.MY_CONSTANT = 'some other value';
console.log(constants.MY_CONSTANT); // 'some value'
Outdated Performance Warning
The following issue was fixed in v8 in Jan 2014 and is no longer relevant to most developers:
Be aware that both setting writable to false and using Object.freeze have a massive performance penalty in v8 – https://bugs.chromium.org/p/v8/issues/detail?id=1858 and https://jsben.ch/AhAVa