Prototype.js 1.6.0 の変更点

ただし Kanasan.JS #1 で読んだ分 (1.5.1.1 での 400 行目相当) まで。

nanto_vi

自己紹介

細かい点

ソースを参照。

Object.isXXX

isElement, isArray, isUndefined and etc.

Function.prototype.xxx

argumentNames
function foo(bar, baz) {}
foo.argumentNames().inspect();
// => ['bar', 'baz']
curry
function add(a, b) { return a + b; }
var add10 = add.curry(10);
add10(20); // => 30
delay
function showMessage(msg) { alert(msg); }
showMessage.delay(3, "Hello, world");
wrap
function リフォームする() { print("匠の仕事"); }
function 修行する() { print("達人の教え"); }
function 紹介する(実作業) {
  print("ビフォー"); 実作業(); print("アフター");
}
var 劇的改造 = リフォームする.wrap(紹介する);
var 愛の貧乏脱出大作戦 = 修行する.wrap(紹介する);
劇的改造();
/* =>
 * ビフォー
 * 匠の仕事
 * アフター
 */
methodize
Number.prototype.pow = Math.pow.methodize();
(2).pow(8); // => 256 (== Math.pow(2, 8))

Class.create

メソッド定義

1.5.1.1
var Foo = Class.create();
Foo.prototype = {
  initialize: function () {},
  doSomething: function () {}
};
1.6.0
var Foo = Class.create({
  doSomething: function () {}
});

複数のオブジェクトからメソッド定義

var 車 = {
  走行する: function () { print("陸の上だ!"); }
};
var 船 = {
  航行する: function () { print("水の上だ!"); }
};
var 水陸両用車 = Class.create(, );
var マイカー = new 水陸両用車();
マイカー.走行する(); // => 陸の上だ!
マイカー.航行する(); // => 水の上だ!

継承

var イヌ科 = Class.create({
  走る: function (場所) {
    print(場所 + "を走る!");
  }
});
var キツネ = Class.create(イヌ科, {
  狩られる: function (場所) {
    print(場所 + "で捕まった!");
  }
});
var フォクすけ = new キツネ();
フォクすけ.走る("三田"); // => 三田を走る!
フォクすけ.狩られる("渋谷"); // => 渋谷で捕まった!

親クラスのメソッド呼び出し

var イヌ科 = Class.create({
  initialize: function (名前) {
    this.名前 = 名前;
  },
  食べる: function (食べ物) {
    print(this.名前 + "は" +
          食べ物 + "を食べた。");
  }
});
var オオカミ = Class.create(イヌ科, {
  initialize: function ($super, 名前, 二つ名) {
    $super(名前);
    this.二つ名 = 二つ名;
  },
  食べる: function ($super, 食べ物) {
    $super(食べ物);
    print(this.二つ名 + this.名前 +
          "は耳を動かした。");
  }
});
var ホロ = new オオカミ("ホロ", "ヨイツの賢狼");
ホロ.食べる("桃の蜂蜜漬け");
/* =>
 * ホロは桃の蜂蜜漬けを食べた。
 * ヨイツの賢狼ホロは耳を動かした。
 */