Hatena::ブログ(Diary)

フリーフォーム フリークアウト

2012-09-30

2010-11-27

os0xos0x 2010/11/28 02:49 スライドの中でObject.seal、Object.freeze、Object.preventExtensionsの順番で取り上げられていますが、この3つのメソッドの関係は、
・Object.preventExtensions は新しいプロパティを作れなくなる
・Object.seal は preventExtensions に加えて、既存のプロパティを non-configurable にする
・Object.freeze は seal に加えて、既存のプロパティを non-writable にする
といったように、preventExtensions → seal → freeze という関係です。seal、freezeはpreventExtensions も兼ねている部分が抜けているように思えました。

あと、IE8は確かにObject.definePropertyをサポートしていますが、DOMオブジェクトにしか適用できないし、そもそもObject.definePropertyとgetOwnPropertyDescriptorだけしかサポートしていないので、IE8+というのは(個人的には)適切ではないように思えます。
さらに細かく言えば、Safari5も preventExtensions、seal、freezeをサポートしていないとかありますが、まあこの辺は次のスライドにある通りで十分だと思いますが。

cou929_lacou929_la 2010/11/28 08:47 コメントありがとうございます.

Object.(preventExtensions|seal|freeze) については私の理解が間違っていました. 仰るとおり "seal、freezeはpreventExtensions も兼ねている" という部分を理解していませんでした.

IE8 の件については, DOMオブジェクトにしか適用できないということを完全に見落としていました. 確かにこれをもって対応していると言ってしまうのは不適切ですね. Compatibility table のページにもこのことについて注意書きがありました. きちんと見ていませんでした…
その他のブラウザについては, スライドを作った段階では Object.defineProperty, Object.getOwnPropertyDescriptor が存在していればOKという風に作りました. ただ, スライド中で他のメソッドも紹介しておきながら, それが使えないブラウザをサポート済みとしてしまうのは不親切ですね.

スライドを修正し, ブログにも追記させていただきます. 指摘していただき勉強になりました. ありがとうございました.