今さら感があるけどprototype.js

prototype.js(ver1.4.0)を使ってみたが、いくつかの罠にはまったのでメモ。ブラウザ上のJavaScriptに詳しい人が見たら当たり前のことばかりかもしれない。

Event.observeする場所 (悩んだ時間:15min.)

↓こんな記述をすると思ったように動作しない。 (alertが出ない)

<head>
〜〜〜
<script type="javascript">
Event.observe(window, 'load', init);
Event.observe($('testButton'), 'click', testButtonClick));

function init() {
  〜〜〜
}

function testButtonClick() {
  alert('hoge');
}
</script>
</head>

よく考えれば当たり前(?)なんだけれど。正解は↓でいいみたい。

Event.observe(window, 'load', init);

function init() {
  Event.observe($('testButton'), 'click', testButtonClick));
}

Object汚染かと思いきや(悩んだ時間:30min.)

悩んだ時間はだいぶ鯖読んでる気がします(挨拶)

既存のwebアプリにprototype.jsを単純にincludeさせてみたらエラー。止まる場所がfor...in文だったのですわ有名なObject汚染の話かと思ったらそれは昔のバージョンのことで1.4.0では修正されていると。確かに。

結論から言うとObjectでなくArrayをハッシュ代わりに使っていた(自分が書いた部分ではないので余計気づかなかった)のが原因だった。(prototype.jsがArrayをextendして便利関数を追加しているため。)

配列と連想配列の区別がないので配列をハッシュ代わりに使う癖が自分にもあった。今度から素直にObjectをハッシュとして使えということで解決。