JavaScript Diary

7 月 6 日分の続き [ 2001/07/11 ]
7 月 6 日文の続きですが、実をいうとあの方法が使えないときもあります。HTML で書き出す部分がリンクオブジェクトであったり、イメージオブジェクトであればすんなりいけるものですが、なかには HTML を書き出さないのにああいったグローバルな値に保持させておきたいときもたまにあるものです。
スクリプト部分が大規模で複雑になったときや、いわゆる Menu クラス( それに付随する Item クラス )等ではそれが困難な場合があります。
では、そういったときどうすれば良いでしょうか? 要は格納するグローバルオブジェクトが一つ存在すれば良いわけですが、JavaScript には既存のグローバルオブジェクトはいくらでも存在します。window や frames , document , String ...。僕は一番しっくりするので document オブジェクトを使用しています。
function Hoge( id ){
    this.id = id ;
    document[ id ] = this ;
}

Hoge.prototype.call = function(){ alert( this.id ); };
ユーザーのなかには複数のサイトから、複数のコードをもらってきて1ページで使用している方もいるでしょう。そのためなるだけバッティングしないようにしたいものです。特に document オブジェクトは Netscape4.x のレイヤーオブジェクトを保持しているので( document.layers[id]document[id] は等価 )、
function Hoge( id ){
    this.id = id ;
    document[ "$VIRGO_"+id ] = this ;
}
ここまでしとけばバッティングはまずないでしょう。宣伝にもなりますし(笑)
window オブジェクトを使用する場合、IE では document.all[id]window[id] が等価であることと、window オブジェクトのプロパティに追加するとそれはグローバルな値になることに注意して下さい(6月18日分参照)。