ヨーキョクデイ

100% pure impurities, which may imply some value. (j は虚数単位)

Tango の Stdout のような出力関数を JS で・その 2

前回 の続き。
前回はバッファを関数(立派なオブジェクト)のプロパティとし、あえてプロパティ名の頭に "_" を付けることでプライベートなもの風、つまり人為的に外からは見ちゃいけないものとしておいた。これは結局はパブリックなプロパティなのだが、もうちょっと隠蔽しようじゃないかというのが今回の話。
比較のために、前回のものをもう少しわかりやすく書いてみた。

function strangeOutput(){
    var f = arguments.callee;
    if(arguments.length){
        f._buffer += Array.prototype.slice.call(arguments);
        // JS 1.6 ならばこれでよい
        // f._buffer += Array.slice(arguments);
    }
    else{
        print(f._buffer);
        f._buffer = "";
    }
    return f;
}
strangeOutput._buffer = "";

strangeOutput が見える場所ならばその _buffer プロパティにアクセスし放題で美しくない。
そこでクロージャを使ってみた。

var strangeOutput = (function(){
    var buffer = "";
    return function(){
        var f = arguments.callee;
        if(arguments.length){
            buffer += Array.prototype.slice.call(arguments);
            // JS 1.6 ならばこれでよい
            // buffer += Array.slice(arguments);
        }
        else{
            print(buffer);
            buffer = "";
        }
        return f;
    };
})();

変数 buffer は 外部からは見えない。これはいい。最高だ。だが関数の定義として見ると気持ち悪いかも。