ただし 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
var Foo = Class.create();
Foo.prototype = {
initialize: function () {},
doSomething: function () {}
};
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 オオカミ("ホロ", "ヨイツの賢狼");
ホロ.食べる("桃の蜂蜜漬け");
/* =>
* ホロは桃の蜂蜜漬けを食べた。
* ヨイツの賢狼ホロは耳を動かした。
*/