値を列挙する時は(場合にもよるかもしれませんが)Object.freeze
を使うといいかもしれません。これを使うとそのオブジェクトの値は(そのままでは)上書きできないようにできます。
また、これはIE9から使えて問題もないです。
使い方
単に引数に上書きを禁止したいオブジェクトを渡すだけです。また戻り値ではただのオブジェクトの用に使うことができます。
Object.freeze({foo: 123})
// {foo: 123}
// `writable`が`false`に
Object.getOwnPropertyDescriptor(Object.freeze({foo: 123}), 'foo')
// {value: 123, writable: false, enumerable: true, configurable: false}
// `Object.freeze`を使わないと`writable`が`true`
Object.getOwnPropertyDescriptor({foo: 123}, 'foo')
// {value: 123, writable: true, enumerable: true, configurable: true}
上書きしようとしてもエラーにはならない
エラーなどは起きませんが、値は元のままです。
const obj = Object.freeze({foo: 123});
obj.foo = 456;
obj.foo // 123
うっかり上書きする・される心配が減ります。