«前の日記(2005-06-04) 最新 次の日記(2005-06-21)» 編集
2002|09|
2003|04|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|10|11|
2008|01|

ひ日誌


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書いてみるとか)


«前の日記(2005-06-04) 最新 次の日記(2005-06-21)» 編集