Prototype 1.6.0 RC

でましたね。 Prototype 1.6.0 release candidate

WEB界隈から離れてしばらくたちますが、またいつWEB界隈に戻るかわからないので一応追ってます。

1.6ではついにClass周りに手が入りました。Prototype.jsといえばシンプルすぎるClass周りとプロパティをコピーするというなんちゃって継承がウリ(?)だったわけですが、1.6からは違います。もう オレオレクラス定義ライブラリ をわざわざ使わなくても大丈夫。

公式にも例がありますが、こんな感じでちゃんと継承できるようになりました。

 1var Animal = Class.create({
 2  initialize: function(name) {
 3    this.name = name;
 4  },
 5  eat: function() {
 6    return this.say("Yum!");
 7  },
 8  say: function(message) {
 9    return this.name + ": " + message;
10  }
11});
12
13var Eatable = {
14  eaten : function() {
15    return this.say("help me!!!");
16  }
17}
18
19var Mouse = Class.create(Animal, {
20});
21//syntax sugar for Object.extend
22Class.mixin(Mouse.prototype, Eatable);
23
24// subclass that augments a method
25var Cat = Class.create(Animal, {
26  eat: function($super, food) {
27    if (food instanceof Mouse) return [food.eaten(),$super()].join("\n");
28    else return this.say("Yuk! I only eat mice.");
29  }
30});
31
32var a = new Cat("Tama");
33alert(a.eat(new Mouse("Nezumy mouse")));

単にプロトタイプチェーンをつなげるだけではなくて、オーバライドされたメソッドの引数名を取得して(toStringしてgrepですね)、$superだった場合、自動的に親クラスのメソッドを$superとして渡してくれます。地味に便利。

あとはsyntax sugarとしてClass.mixinがあります。まぁObject.extendなんですが、こっちの方がわかりやすいですよね。  

 

  そのほかもいっぱい機能が追加れさてれてますね。個人的には document.observe("contentloaded", function() { ... }) て感じでサポートされたDOM完了時点でのイベントと、

1$("container").observe("titleChanged", function(event) {
2  this.highlight({ duration: 0.5 });
3});
4
5$("title").fire("titleChanged");

って感じのカスタムイベントが必ず使いそうな機能かな。


資格の勉強とかもそろそろしなきゃなー、と思いつつ、Scalaでパーサコンビネータライブラリがついたので、Schemeの処理系でも実装したいなあ、と思い始めてる今日この頃。

comments powered by Disqus