数冊JavaScript本を読んだところ、クラス(もどき)の記述方法が数パターンあるみたいなのでまとめておく。
サンプルとしては前回同様オライリーの「JavaScriptグラフィックス」で用いられているスプライト描画を使わせていただきました。
パターンその1:
関数を用いる方法。「JavaScriptグラフィックス」で推奨されている方法である。
myClass=function(引数){ that={ xxx..... }; return that; } var インスタンス=myClass(引数)
http://www.oreilly.co.jp/pub/9784873115283/ch02/ex0201.html
パターン1のソースについてはオライリーの書籍と上記URLを参照いただきたい。
パターンその2:
「教科書的」と言われている方法。
クラス風にインスタンスを生成する。
var インスタンス=new MyClass( 引数 )
それではパターン1の関数を用いる方式から。
サンプルの流れは以下の通り
1.htmlでid指定されているエリア
<div id="draw-target"></div>
を取得し、背景画像にcssで幅・高さ・該当画像(スプライトシート:(いくつかの画像が固定ピクセル毎に行と列で描かれているもの)を指定する
var DHTMLSprite=function(params){ var width=params.width; var height=params.height; var imagesWidth=params.imagesWidth; //html記載 id:draw-targetにdivを追加。 //そのdiv(即ち今追加したdiv)を$element変数に格納する var $element= params.$drawTarget.append('<div/>').find(':last'); $element.css({ position:'absolute', width:width , height:height, backgroundImage:'url('+params.images+ ')' }); var elemStyle=$element[0].style;//$elementのスタイルシートを格納。
2.スプライトシート中の何番目の画像を使うか指定するメソッドを作る
changeImage:function(index){ index*=width; var vOffset=-mathFloor(index/imagesWidth)*height;//y座標 var hOffset=-index%imagesWidth; //x座標 elemStyle.backgroundPosition=hOffset+'px' + ' '+ vOffset +'px'; } ,
3.描画の際の座標を指定するメソッドを作る
darw:function(x , y){ elemStyle.left=x+'px'; elemStyle.top=y+'px'; },
生成は以下のとおり関数の受けで行う。
var sprite1=DHTMLSprite(params); var sprite2=DHTMLSprite(params);
サンプルではスプライトシート1つめ(指定していない場合デフォルト1つめ)の歯車の画像が座標x=64 y=64に、5つめのグラデーション画像がx=352 y=192に、それぞれ描画されている。
sprite2.changeImage(5); sprite1.draw(64 , 64); sprite2.draw(352 , 192);
一方、パターン2の教科書的方法は少々ややこしい。DHTMLSpriteクラスを作ってみた。全文記載。
function DHTMLSprite(params){ this.width=params.width; this.height=params.height; this.imagesWidth=params.imagesWidth; this.$element=params.$drawTarget.append("<div/>").find(":last"); this.$element.css( { position:"absolute" , width:this.width , height:this.height, backgroundImage:"url("+ params.images + ")" } ) this.elemStyle=this.$element[0].style; //要素を引数にしたjQueryオブジェクトは //DOM要素が配列で格納されている状態なので //$('#xxxx')[0]でDOM要素の参照となる。 this.mathFloor=Math.floor; //高速化のためMath.floorのローカル参照を持つ } DHTMLSprite.prototype.draw=function(x , y){ with(this){ elemStyle.left=x+"px"; elemStyle.top=y+"px"; } } DHTMLSprite.prototype.changeImage=function(index){ with(this){ index*=width; var vOffset=-mathFloor(index/imagesWidth)*height ; //y座標 var hOffset=-index%imagesWidth ; //x座標 elemStyle.backgroundPosition =hOffset+'px' + " "+vOffset+'px'; } } DHTMLSprite.prototype.show=function(){ with(this){ elemStyle.display="block"; } } DHTMLSprite.prototype.hide=function(){ with(this){ elemStyle.display="none" } } DHTMLSprite.prototype.destroy=function(){ with(this){ $element.remove(); } }
生成は
var sprite1=new DHTMLSprite(params); var sprite2=new DHTMLSprite(params);
で行う。描画の指定方法は変わらない。
thisが多いためやや汚く見えるが、生成がActionScript風なのでこちらの方が好みではある。次回は継承についてまとめる。