« クロージャにプロパティをセットする??? | main | プラズマによる立体ホログラフィー »

2006年02月07日

一定の範囲の値しかとらない変数の宣言方法

tokyoace4.comの一定範囲内の値しかとらない変数を動的につくれないか?ってエントリを、電車の中で延々と考えつづけたら、微妙に議題と違うけど面白いアイデアがでけた。

かなり変態チックなコードですが、一定の範囲の値しかとらないプロパティ変数の宣言方法

まず、以下のような関数を用意する。


/*
対象のオブジェクトに一定の範囲しか値をとらない、プロパティ変数を定義する
obj - オブジェクト
propName - プロパティ名
min - 最小値
max - 最大値
*/
function setLimitedProp(obj, propName, min, max){
  var getFunc = function(){
    return this[ "__"+propName] 
  }
  var setFunc = function(val){
    this[ "__"+propName] = Math.min(Math.max(val, min), max)
  }

obj.addProperty(propName, getFunc, setFunc)
obj[ "__"+propName] = 0
}

で、以下のように使う。例えば_rootに0から100の値しかとらない変数hogeが欲しい場合、


//0-100の値をとる変数hogeを作成する
setLimitedProp(_root, "hoge", 0, 100); //特定の値しかとらないプロパティを定義
hoge = 9999
trace(hoge) // returns 100

ローカル変数として使えないとか、インスタンス毎に無名関数を持つからメモリ効率がアレだとかっていうツッコミはあるけど、プロトタイプに対して定義したり、クラスのコンストラクタ内で使うようにしたら、これはちょっと便利かもわからん。

投稿者 Taka : 2006年02月07日 01:59

book

dotfla.gif

bookmark

はてなブックマークに追加

del.icio.usに追加

trackbacks

this entry's trackback URL:
http://www.fladdict.net/cgi-bin/mt3/mt-tb.cgi/455

このリストは、次のエントリーを参照しています: 一定の範囲の値しかとらない変数の宣言方法:

» IRS from IRS
IRS [read more]

トラックバック時刻: 2006年02月23日 16:09

» Beauty from Beauty
Beauty [read more]

トラックバック時刻: 2006年02月24日 06:13

» Glow Stick from Glow Stick
Glow Stick [read more]

トラックバック時刻: 2006年02月24日 14:09

» Refinance from Refinance
Refinance [read more]

トラックバック時刻: 2006年02月24日 19:43

» black eyed peas don't funk with my heart from
black eyed peas don't phunk with my heart [read more]

トラックバック時刻: 2006年02月28日 21:22

» rape videos from
brutal dildo rape me [read more]

トラックバック時刻: 2006年02月28日 21:23

» fix you coldplay mp3 from
coldplay you only live twice mp3 co... [read more]

トラックバック時刻: 2006年02月28日 21:23

» Pizza Review from Pizza Review
Pizza Review [read more]

トラックバック時刻: 2006年03月17日 05:57

» live cricket from cricket scores
live cricket [read more]

トラックバック時刻: 2006年03月21日 17:20

» accident lawyer from lawyer information
accident lawyer [read more]

トラックバック時刻: 2006年03月28日 00:52

comment

なるほど!
AddPropertyを使えばできるんですね。

こちらの解説を読みながらAddPropertyを勉強しました。
http://faces.bascule.co.jp/private_static.html

by takachin : 2006年02月07日 08:50

AddPropertyってこういう風に使えるんですね。
勉強になります。φ(`д´)

by 木本達朗 : 2006年02月07日 11:35

いつもながらチャレンジ精神旺盛ですねー
ところで、気になる箇所が2点ほど。

まず、addProperty は obj.addProperty にしておかないと
 a = {};
 setLimitedProp( a, "hoge", 0, 100 );
とかやった時に階層がズレちゃいます。

それと、せっかく無名関数使っているのだから、値の格納先も
ローカル変数にしてしまってクロージャ化しておいた方が
値を汚染されずに済みますね。

var value = 0;
var getFunc = function(){
 return valuie;
}
var setFunc = function(val){
 value = Math.min(Math.max(val, min), max)
}

こんな感じで。

by mune : 2006年02月07日 14:13

>まず、addProperty は obj.addProperty にしておかないと
修正しましたー

>値の格納先もローカル変数にしてしまってクロージャ化
こっちは好みの問題ですよね・・・僕の場合オリジナルに例外が欲しいので残しとく方向で。

コメントサンクスでっす

by Taka : 2006年02月07日 14:22

おぉ!

by tohsaki : 2006年02月08日 01:06

コメントしてください




保存しますか?