2013年10月30日水曜日

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

みなさん!XPages開発していますか!?
JavaScriptでよく使用されるパターンについてご紹介したいと思いますが、その前にパターンでもよく使用されるオブジェクト・リテラルについて説明したいと思います。

オブジェクト・リテラル

リテラルとはソースコード中に直接記載される定数のことです。
数値・文字列のリテラルは下記のようになります。これは通常良く使われますよね。
var name = 'abcd'; //文字リテラル
var count = 0; //数値リテラル
    
オブジェクト・リテラルは、下記のような記述になります。
//{}で囲むとオブジェクト・リテラル
// メンバー名 : 値 でプロパティ
// メンバー名 : function(){} でメソッド
var obj = {
    name: 'hoge', //プロパティ
    getName: function(keisho){
        return this.name + ' ' + keisho;
    }
}
print(obj.name); // "hoge"
print(obj.getName('さん')); // "hoge さん"
    
メソッドは名前なし関数を定義することで実装することができます。またその内部で自分自身を表すのに this を用いることができます。
これで作成されたオブジェクトは他のオブジェクトと何ら変わらず扱えるため、当然プロパティ値を変更したり、メンバーを追加したりすることもできます。
var obj = {
    name: 'hoge', //プロパティ
    getName: function(keisho){
        return this.name + ' ' + keisho;
    }
}
obj.name = 'geho'; //プロパティ値の変更
obj.lastName = 'foo'; //プロパティの追加
    
リテラルは定数なのに変更できるのはどういうこと?と思われる方がいるかもしれませんが、それを理解するにはメモリのヒープ領域のポインタが…みたいな話になるのでここでは割愛します。(^^ゞ
これの利点としては、関連するいくつかのリテラルや、クラスでいうところの static な変数や関数をまとめておくことができることが挙げられます。
また、関数で多くの引数が必要になる場合、使用者側はその順番を把握しなくてはならず、また省略できる項目が中にあった場合、nullなのか空文字なのかわかっておく必要があり、不便です。また拡張する場合は、引数の最後に付け足していくほかありません。
そこで、引数をオブジェクトととし、関数を使用する側はオブジェクト・リテラルを使用して渡すことで、非常にわかりやすくなり、拡張しやすくもなります。
//bad pattern
var addUser = function(name, lastName, age, corporation, department){
}
//Good Pattern
var addUser = function(user){
    user.name; //などとして引数にアクセス
    var department = user.department || 'なし'; //departmentがない場合のデフォルト値
}
//使用者側
addUser({
    lastName: 'ebihara', //順番を意識しなくても良い
    name: 'kenji',
    age: '39',
    corporation: 'RITS'
    //department: 'kagoshima //省略できる項目は入れない事もできる。(関数側で配慮が必要)
});
    
Javaなど他のオブジェクト指向言語では、オブジェクトを作成するにはクラスが必要なのに、この場合のクラスは何?と思う人もいると思います。
実はJavaScriptにはクラスと言う概念はありません。存在するのは、オブジェクトと関数のみです。
しかし関数にはクラスのように扱える、コンストラクタ関数というものもあります。
これについては次回以降に説明したいと思います。
海老原 賢次(EBIHARA Kenji)
リコーITソリューションズ株式会社(RICOH IT SOLUTIONS CO.,LTD.)
鹿児島ソリューション部(Kagoshima Department)

0 件のコメント:

コメントを投稿