latest log

酩酊状態で書いたエンジニアポエムです。酩酊状態で読んでください。

さいきんのもふもふ

mofmof.js でクラス

// 汎用クラスHogeを定義する
mm.Class("Hoge", { ... });

// SuperClassを継承した汎用クラスHogeを定義する
mm.Class("Hoge:SuperClass", { ... });

// シングルトンなクラスHogeを定義する
mm.Class.singleton("Hoge", { ... });

// 継承しない(軽い)クラスHogeを定義する
mm.Class.lite("Hoge", { ... });

ここ数日のもふもふ(mm.Class ネームスペース辞めた)

// 汎用クラスHogeを定義する
mm("Hoge", { ... });

// SuperClassを継承した汎用クラスHogeを定義する
mm("Hoge:SuperClass", { ... });

// シングルトンなクラスHogeを定義する
mm("Hoge:Singleton", { ... });

// 継承しない(軽い)クラスHogeを定義する
mm("Hoge:Lite", { ... });

// 実装を貸し出す事が可能なダックタイプクラスHogeを定義する
mm("Hoge:DuckType", { ... });

Hoge:*** の部分に、親クラスだけじゃなくステレオタイプもくっつけてクラスの役割を明確にすれば、より分かりやすいんじゃないかな? と考えてました。

素のJavaScriptコードとmofmof.jsを使ったコードの比較

素のJavaScript

function Hoge() {
    this.init(arguments);
}
Hoge.prototype = {
    init: function() { // @var_args: Mix
        /* なにか */
    },
    tick: function() {
        /* なにか */
        var that = this;
        setTimeout(function() {
            that.tick();
        }, 0);
    }
};
var hoge = new Hoge();

mofmof.js版

mm("Hoge:Lite", {
    init: function() { // @var_args: Mix
        /* なにか */
    },
    tick: function() {
        /* なにか */
        0..lazy(this.tick, [], this);
    }
});
var hoge = new mm.Hoge();

mm("Hoge", ... ) でもいいのですが、mm("Hoge:Lite" ... ) とすることで「カプセル化のみ。継承しないクラス」という意味になります。

拡張メソッド Number#lazy

mofmof.js には ES5 の Function#bind の polyfill(代替え実装)も入ってますが、Number#lazy という遅延評価のメソッドも用意しています。Number#lazy は、(1).遅延で呼び出す関数, (2).関数に与える引数, (3).関数のコンテキスト(this) を受け取り、しばらく後に関数を呼び出します(10..lazy なら 約10秒後です)。

以下は、 Number#lazy の例です。これら3つのコード片は全て同じ結果になります。

// 1. Number#lazy を使った方法
0..lazy(this.tick, [], this);


// 2. Function#bind を使った方法 (ややデバッグし辛い)
setTimeout(this.tick.bind(this), 0);
 

// 3. that=this イディオムでベタ書き (デバッグしやすい)
var that = this;

setTimeout(function() {
    that.tick();
}, 0);

(ε・◇・)ゞ ではでは