人物のクラスを定義し, それを継承したユーザのクラスを作ります.

クラスの継承用の関数を作成

今回はクラスを継承するための関数として以下のような関数 inherit を定義しました:

function merge(){
    var args = Array.prototype.slice.call(arguments);
    var ret = {};
    var itm;
    for (var i = 0; i < args.length ; i++) {
        var arg = args[i];
        for (itm in arg) {
            if (arg.hasOwnProperty(itm)) {
                ret[itm] = arg[itm];
            }
        }
    }
    return ret;
}
function inherit(Parent, o) {
    Parent.prototype = merge(Parent.prototype, o);
    return new Parent();
}

クラスの定義

関数宣言によって人物クラスを定義します:

// 人物クラス
function Human() {
    this.className = '人物';
    this.getProfile = function() {
        return "【人物プロフィール】名前: " + this.name + ", 年齢: " + this.age;
    }
}
Human.prototype = {
    name: 'nodata',
    age: 'nodata'
}

不変のメンバは直接コンストラクタ関数で定義し, 作成するインスタンスごとに値が変わりうるメンバはプロトタイプに定義しています.

続いて, ユーザクラスを定義します:

function User(user) {
    this.className = 'ユーザ';
    this.getUserProfile = function() {
        return "【ユーザプロフィール】名前: " + this.name + ", 年齢: " + this.age + ", 訪問回数: " + this.visit;
    }
    if (user !== undefined) {
        for (var i in user) {
             this[i] = user[i];
        }
    }
}
User.prototype = inherit(Human, {
    visit: 'nodata'
});

デフォルト値は上のように undefined と比較することで設定します. 関数 inherit の第二引数に, ユーザクラスにおいてプロトタイプ定義したいものを渡します.

インスタンスの作成

// ユーザインスタンス作成
var taro = new User({
    name: 'たろう'
});
var jiro = new User({
    name: 'じろう',
    age: 20,
    visit: 120
});

// 結果
taro.getProfile();     // 【人物プロフィール】名前: たろう, 年齢: nodata
taro.getUserProfile(); // 【ユーザプロフィール】名前: たろう, 年齢: nodata, 訪問回数: nodata
jiro.getProfile();     // 【人物プロフィール】名前: じろう, 年齢: 20
jiro.getUserProfile(); // 【ユーザプロフィール】名前: じろう, 年齢: 20, 訪問回数: 120