JavaScriptのオブジェクトを定数として扱う方法

[`evernote` not found]
[`livedoor` not found]
[`yahoo` not found]

オブジェクト指向JavaScriptの原則という本で知ったのですが、ECMAScript 5からはオブジェクトをロックする機能があるようで、プロパティの追加や削除の禁止だけでなく、値の書き換えのようなこともできる方法があるようです。これで定数のようなことができそうだと思ってやってみました。Object.freezeというメソッドを使うとできるようです(参考:Object.freeze – JavaScript | MDN)。

確かに、Object.freezeメソッドを使うとオブジェクトの値が変更することができなくなりました。試しに、『Object.freeze(TAX);』の箇所を削除してみるとconsole.logの出力はそれぞれ『0.1』、『90』『2014』となりました。

ところで、定数というと思いつくのはむしろconst宣言だと思います(参考:const – JavaScript | MDN)。

ただし、const宣言にはIEは10以前では対応していなかったりそもそもECMAScriptで定義されていないなどいろいろ問題もあります(Object.freezeはIE9より対応)。さらにいうと、constで宣言したオブジェクト変数の値は変更できてしまいます。

ここまで書いて、ふと、そういえばさっきObject.freezeでプロパティ値の書き込みをできないようにしたサンプルではオブジェクト自体を変更してなかったなと思ってやってみた。

変更できてしまった・・・。

const宣言+Object.freeze()というのがある意味一番いいのかもしれません(そもそも、定数をオブジェクトとして扱う必要ってそんなにないような気もしますが・・・)。

2014年8月26日追記
このfreezeってオブジェクト内のメソッドからでも変更できないだろうかと思い、試してみた。

変更できませんでした(『Object.freeze(TAX);』の行をコメントアウトすると、0.1となる)。

オブジェクト指向JavaScriptの原則
オブジェクト指向JavaScriptの原則

コメントを残す

メールアドレスが公開されることはありません。