Sapporo.js-2011.03.05を開催しました

Sapporo.js-2011.03.05 : ATND


この本もついに5章に入りました。

今回は蝶々本に載ってないところでも議論が盛り上がったので、話題に出たコードを貼り付けてみようと思います。


まずは4.15 メモ化から

用意されていたmemoizer関数に、キャッシュの破棄機能をつけてみよう、という話。

var memoizer = function(memo, fundamental) {
    var shell = function(n) {
        var result = memo[n];
        if (typeof result !== 'number') {
            result = fundamental(shell, n);
            memo[n] = result;
        }
        return result;
    }
    // リセットメソッド
    shell.reset = function(ini) {
        memo = ini;
    }
    return shell;
}

var fibonacci = memoizer([0, 1], function(fib, n) {
    return fib(n - 1) + fib(n - 2);
});
// 引数で与えたオブジェクトでリセット
fibonacci.reset([0, 1]);


また、本当に記憶したキャッシュを利用しているのかの確認のために、カウンターを設定してみます。

// 一回の関数呼び出しで計算が実行された回数
var t = 0;
// 実行された総回数
var total = 0; 

var fibonacci = memoizer([0, 1], function(fib, n) {
    t += 1;
    return fib(n - 1) + fib(n - 2);
});

// 降順で表示させているので、初回以降はすべて計算が行われていないことを確認する
for (var i = 10; i >= 0; i -= 1 ) {
    t = 0;
    // リセット機能の確認用
    // fibonacci.reset([0, 1]);
    document.writeln('// ' + i + ': ' + fibonacci(i));
    total += t;
    document.writeln(t);
}

document.writeln(total);


次は5章、継承なのですが、プロトタイプについてのおさらいです。
@bad_at_math さん、thxです!

// 一般的なプロトタイプ継承の例
var Child = function() {};
Child.prototype; // [Object object]
Child.prototype.hoge = "xxx";
var child = new Child();
child.hoge; // "hoge"

// オブジェクトからプロトタイプを設定する例(Mozillaのみ)
var c = {}, p = {};
p.__proto__ = {hoge: "ooo"};
c.__proto__ = p.__proto__
c.hoge; // "ooo"

また、間違えやすいのですが、以下の例はプロトタイプを設定できていない例です。
(ただ、"prototype"というプロパティが設定されるだけです。)

var c = {}, p = {foo: "bar"};
c.prototype = p;
c.hoge; // undefined


また、当日は、 @bad_at_math さんがLTをしてくださいました。

話の内容もすばらしかったのですが、何よりそれを即興でお話してくださったのがすごかったです。


また、当日の様子を @aloelight さんがまとめてくださっています。


次回開催は未定ですが、ご興味ある方はぜひいらしてください:-)
次回はp.56から始める予定です。


JavaScript: The Good Parts ―「良いパーツ」によるベストプラクティス

JavaScript: The Good Parts ―「良いパーツ」によるベストプラクティス