ひ日誌
2005-06-09 ( ja -> en )
_ [javascript] なんだか Scheme っぽいじゃないか
脳が溶けそうになってきたときの息抜きなど兼ねて、もしくはAJAXブームに乗せられて、JavaScript をちょくちょく試してるのだけど、 「なんだか Scheme っぽいじゃないか」というわけでますます気に入ってきた。 関数が他のオブジェクトと同等のfast classオブジェクトだとか。 で Scheme っぽいのだが Scheme と比べると構文糖が多くて、そういうところで混乱。 ここらへんをある程度整理するのに、図書館で借りてきた「JavaScript & DHTMLクックブック」が結構参考になった。
で、インスタンスメソッド(っぽい)の定義方法がだいたいわかった。 Array や Object などクラスっぽい振る舞いをするオブジェクトは、constructor関数というらしい。 constructor関数には prototype という属性(property)がある。これはインスタンスの雛形のようなもの。 つまり、prototypeの属性が、そのクラスのインスタンス変数もしくはメソッド(=値が関数オブジェクトなインスタンス変数)のような感じになってる。
Ruby の Enumerable#each, map, filter 相当のものを、この前は特異メソッド的に定義したが、インスタンスメソッド的に定義するとすると、たとえば次のように定義できる:
/** Array#each (<procedure>) */
Array.prototype.each = function(proc) {
for (var i = 0; i < this.length; i++) proc(this[i], i);
return this;
}
/** Array#map (<function>) */
Array.prototype.map = function(func) {
var result = new Array;
this.each( function(i) { result.push(func(i)) } );
return result;
}
/** Array#filter (<function>) */
Array.prototype.filter = function(func) {
var result = new Array;
this.each( function(i) { if (func(i)) result.push(i) } )
return result;
}
ary = [1,2,3,4,5,6,7,8,9,10]
ary.map(function(i){return i*2 }).filter(function(i){return i%3==0 })
// => 6,12,18
これにRubyのブロックのような構文があれば…
それと、JavaScript + DHTML でのユーザインターフェースは、かなり Cocoa アプリっぽく書けそうなことに気づいてきたのだが、それについてはまたいずれ……(Currency Converter書いてみるとか)
[ツッコミを入れる]