javascript実験5 prototypeを発見
このページのあたりをみてた >http://itpro.nikkeibp.co.jp/article/COLUMN/20070626/275986/?P=3
javascriptでは、組込み関数的なものを動的に定義できるみたい。
その時には、prototypeを使う。
例えば、Arrayオブジェクトに新たな関数を定義
Array.prototype.each = function(func){ for (var i=0, j = this.length; i < j; i++){ func(this[i]); } }; //ここにセミコロンが必須(何でか後で考える) [1,2,3,4,5].each(print) Array.prototype.map = function(func, arg) { var arr=[]; for (var i=0, j = this.length; i < j; i++){ arr.push(eval("this[i]"+func+arg)); } return arr; }; print([1,2,3,4,5].map("+", 10)) //=>11,12,13,14,15
map(rubyのmapのようなもの)はeval使わないとできなかった。
memo
ただし,ドット演算のたびにオブジェクト化が発生するので,ドット演算が多発する場合には非効率になってしまいます。このような場合は,最初からプリミティブ値をオブジェクトに変換しておくといいでしょう。
ふむふむ、ドットを使いすぎると遅くなるらしい。
あと、createHuman関数が便利だと思った。>上のlinkのページのなかに載っている関数
追記
こっちの方がrubyのmapに近いかも。
Array.prototype.map = function(arg,exp){ var arr=[] exp=exp.replace(arg,"this[i]"); for (var i=0, j=this.length; i < j; i++) { arr.push(eval(exp)); } return arr } print([1,2,3].map("e", "e + 3")) //=>4,5,6
さらに追記
前回のmapは、「e * e」などが使えない。
ということで、こちらに変更
Array.prototype.map = function(arg,exp){ var arr=[] regexp= new RegExp(arg,"g") exp=exp.replace(regexp,"this[i]"); for (var i=0, j=this.length; i < j; i++) { arr.push(eval(exp)); } return arr } print([1,2,3].map("e", "e * e")) //=>1,4,9
変数argを展開しつつ、「replace(/a/g, "b")」のgフラグ付き正規表現を使う方法を探すのに少し時間がかかった。