JavaScript でのクラス定義の一例

  • 投稿日:
  • by
  • カテゴリ:

つい C++ や Java といった多言語でのオブジェクト指向に影響されて、JavaScript でもクラス作るときに

function Request(method, param){
    this.method = method;
    this.param = param;
}
Request.prototype = {
    init: function(opts){
        method.prepare(opts);
        return this;
    },
    send: function(sender){
        sender.send(this);
        return this;
    },
    setParam: function(k, v){
        param[k] = v;
        return this;
    },
    getParam: function(k){
        return param[k];
    }
}

var request = new Request("GET", { id: "boeboe" });

といった書き方をしてしまうけど、プロトタイプ志向の JavaScript 的にはイマイチというか、あとから prototype をいじって全インスタンスのメソッド差し替えとか全然余裕でできてしまうのでスッキリしない。

どうせ JavaScript で書くのなら、こんな風にしたほうが「違う言語」感が強まって「設計が全く異なるのに名前とか書式が似てるせいで生じる誤解」も防げてマシなんじゃないかと。

var createRequest = function(method, param){
    var that = {};

    var init = function(opts){
        method.prepare(opts);
        return that;
    }
    that.init = init;

    var send = function(sender){
        sender.send(that);
        return that;
    }
    that.send = send;

    var setParam = function(k, v){
        param[k] = v;
        return that;
    }
    that.setParam = setParam;

    var getparam = function(k){
        return param[k];
    }
    that.getParam = getParam;

    return that;
}

var request = createRequest("GET", { id: "boeboe" });

ほかの言語と比較するととても珍妙な感じだけど、こうした与えた createRequest() の引数 method とか param はもう外から絶対アクセスできない。作ったインスタンスごとのメソッド差し替えはできるけど、クラスとして定義されたメソッドはもう変更できないし。
スコープとか独特。

継承も何も考慮してないクラスだけどシンプルな設計のものならこれでじゅうぶんだし、凝った設計のものでもまた別の書き方で「JavaScript らしさ」は出せるわけだし。

いいかげん「とりあえず prototype プロパティを上書き」的にスタイルは廃れないかなとか思った。