2013年12月11日水曜日

連載:ちょっとディープなXPages 第2-9回~JavaScriptをもっと知ろう

みなさん!XPages開発していますか!?
今回から数回に分けてオブジェクトの継承について話したいと思います。
前回、prototypeの説明をしましたが、それも1つの継承です。しかし、JavaScriptではオブジェクトのすべてを、コンストラクタ関数を使用して作成することは多くありません。
もっと手軽に継承する方法が幾つかあります。

ミックスイン

ミックスインとは2つ以上のオブジェクトのすべてのメンバーを持つ1つのオブジェクトに統合することです。多重継承に近い概念でしょうか。
JavaScriptでの用途としては、ある関数の引数にオブジェクトを渡すこととして、そのオブジェクには設定しなくてもよいメンバーがあるとします。
設定されなかったメンバーは関数内でのデフォルト値が設定されることつぃます。
下記の例では、ユーザー登録関数に姓名と年齢、性別を持つオブジェクトを渡すことを想定しています。年齢と性別は渡さなくても良いですが、その場合は、デフォルト値として"-1"と"N"が設定されるようにします。
ミックスインを使用しない場合は、ifで個々を判断する必要があります。
    //ミックスインを使用しない場合
    var addUser = function(obj){
        //本来であれば姓名の必須チェックが必要
        if(!!obj.age){
            obj.age = -1;
        }
        if(!!obj.gender){
            obj.gender = 'N';
        }
    }
    //利用側
    addUser({name: 'Kenji Ebihara'});
    
この例では2つのプロパティだけなので、それほど大変ではありませんが、メンバーの数が増えてくると大変なのは想像できると思います。
そこで、ミックスインを使用します。
    //ミックスインを使用する場合
    //引数のデフォルトのメンバーを作成
    var addUserDefaultArg = {
        age : -1,
        gender : 'N'
    }
    var addUser = function(obj){
        //本来であれば姓名の必須チェックが必要
        var arg = mixin(addUserDefaultArg, obj);
        print(arg.age);
        print(arg.gender);
    }
    //ミックスイン関数
    var mixin = function(base, child){
        var newObj = {}, member;
        //デフォルトのオブジェクトのメンバーをコピー
        for(member in base){
            newObj[member] = base[member];
        }
        //継承するオブジェクトからメンバーをコピー
        //デフォルトと同じメンバーがあったら上書きされる
        for(member in child){
            if(!!child[member]){ // nullやundefindの場合は引き継がない
                newObj[member] = child[member];
            }
        }
        return newObj;
    }
    //利用側
    addUser({name: 'Kenji Ebihara'}); // -1, 'N'が出力される
    
mixin関数は、for-inを利用してオブジェクトのメンバーをすべてコピーし、そのあとで継承するオブジェクトのメンバーをコピーすることで、継承するオブジェクトに含まれないかnull,undefindのものは継承元のオブジェクトのものが採用されます。

次回は

継承とは少し違いますが、他のオブジェクトのメソッドを利用する、「メソッド拝借」について解説します。
海老原 賢次(EBIHARA Kenji)
リコーITソリューションズ株式会社(RICOH IT SOLUTIONS CO.,LTD.)
鹿児島ソリューション部(Kagoshima Department)

0 件のコメント:

コメントを投稿