Firefox3で追加の「__count__」プロパティはFirefox4で廃止
自分で作ったオブジェクトのプロパティ数を知りたいときに使えるという触れ込みの「__count__」プロパティの短い生涯
- New in JavaScript 1.8.5
- Fx3系
- javascript1.8
- 「__count__」プロパティ追加
- Fx4系
- javascript1.8.5
- 「__count__」プロパティ廃止
- ついでに「__parent__」プロパティも廃止
削除の背景
- bug 551529
- 「削除したい」提案にBrendan Eichは一つ返事で「削除。糞磨きみたいな代物だし、ES5で同じことできるだろ」とか「ついでに__parent__も削除」とリプライ
- Where's Walden? » More changes coming to SpiderMonkey: the magical __count__ property is being removed
- 「__count__」の問題点列挙してる
- 問題点1:非標準。オレオレプロパティ。SpiderMonkey限定
- 問題点2:オブジェクトをハッシュとして使う際に面倒になる
- 変更できないkeyがハッシュの中に存在することを許容
- 値を更新できない。「__count__=5」とか後からできない。初期化時点の値(定義してないなら0)で固定
- 問題点3:JITコンパイラの恩恵を受けれれない。最適化されないコード(deoptimization code)になる
- 問題点4:期待してるほど速くない。forループ回す時同様にメモリ割り当て必要。
影響
- ベストプラクティスから脱落
21.javascript 1.8ならオブジェクトのプロパティ数を取得できる。 function getPropertyCount(obj) return obj.__count__; JavaScriptベストプラクティス30選-jsEdu
上記テクニックはFx3系限定のテクニックとなった
- LABjsの実装変更
- Fx判別用に「__count__」プロパティ参照してた
- 代わりに「"MozAppearance"」が「window.document.documentElement.style」にあるかチェック方法に変更
//before:__count__使ってFxを判別 is_gecko = (function(o) { o[o] = o+""; return o[o] != o+""; })(new String("__count__")) //after:"MozAppearance"の有無で判別 is_gecko = ("MozAppearance" in oDOC.documentElement.style) //「oDOC」は「window.document」がキャッシュされてる //LABjsではminify最適化のために //こういう工夫(minify後にバイト数が削られやすいようにする)を //随所でやってる