« 懐かしの CGI カウンターとか | ホーム | また JavaScript »

2010年2月26日

JavaScript でのクラス定義の一例

つい 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 プロパティを上書き」的にスタイルは廃れないかなとか思った。

トラックバック(0)

トラックバックURL: http://archive.guma.jp/mt/mt-tb.cgi/16

コメントする

OpenID対応しています OpenIDについて

このブログ記事について

このページは、Mocelが2010年2月26日 17:35に書いたブログ記事です。

ひとつ前のブログ記事は「懐かしの CGI カウンターとか」です。

次のブログ記事は「また JavaScript」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。