12. ユーザー定義オブジェクト
ユーザー定義オブジェクトというのはC++やJavaのクラスのように、
変数と関数をひとまとめにしたものです。
組み込みオブジェクトにならって、
変数はプロパティ、関数はメソッドと呼びます。
こうやってひとまとめにできるものはそうしたほうが、
プログラムを書くにあたって考えがまとまりやすくなり、
非常にコードが書きやすくなります。
ユーザー定義オブジェクトは次のように関数の形式で定義します。
function Person(name, jpn, math, sci, soc, eng) {
this.name = name; //名前
this.jpn = jpn; //国語の点数
this.math = math; //数学の点数
this.sci = sci; //理科の点数
this.soc = soc; //社会の点数
this.eng = eng; //英語の点数
}
ここでは引数をプロパティに代入して初期化しています。
プロパティとメソッドには
this
をつけて定義します。
this.name = name;
は、 name プロパティに引数の name を代入する、となります。
プロパティはここで値を代入する必要はなく、
function Person() {
this.name;
}
としてもnameがPersonオブジェクトのプロパティになります。
この関数はオブジェクトが生成されるときに実行されるものなので、
最初に実行したいことはすべてここに書いておきます。
function Person(age, sex) {
this.age = age;
this.sex = sex;
if(this.sex == "male") //男なら
this.marrigeable = (age >= 18);
else //女なら
this.marrigeable = (age >= 16);
}
sexプロパティが"male"でageプロパティが18以上なら
marrigeableプロパティが
trueになる、、、
といった具合です。
オブジェクトは 組み込みオブジェクトと同様に
new を使って生成します。
プロパティへのアクセスも組み込みオブジェクトと同様です。
function test1() {
var p1 = new Person("辻", 45, 78, 51, 51, 24);
alert(sum1(p1));
p1 = null; //オブジェクトの削除
}
function sum1(p) { //合計の点数を返す
return p.jpn + p.math + p.sci + p.sco + p.eng;
}
ボタンを押すと合計の点数が表示されます。
このようにオブジェクトにすると、引数をそのオブジェクトだけにできるので
非常にすっきりして考えやすくなります。
メソッドの定義は次のようにサブルーチン名を指定します。
function test2() {
var p = new Person("辻", 45, 78, 51, 51, 24);
var s = p.sum();
var ave = p.average();
alert("合計 : " + s + " 平均 : " + ave);
}
function Person(name, jpn, math, sci, soc, eng) {
this.name = name;
this.jpn = jpn;
this.math = math;
this.sci = sci;
this.soc = soc;
this.eng = eng;
this.sum = sum; //メソッド
this.average = average; //メソッド
}
function sum() {
return this.jpn + this.math
+ this.sci + this.soc + this.eng;
}
function average() { return this.sum() / 5; }
合計点と平均点が表示されます。
メソッドの定義は次のように直接的にもできます。
function Person(name, jpn, math, sci, soc, eng) {
...
this.average = function() {
return this.sum() / 5;
}
}
さきほどの関数を使ったのとほとんど変わりませんが、考え方が違います。
関数を使うほうは、関数にオブジェクトを渡して「これの合計を計算しといてね」
と依頼して結果を出してもらうという感じですが、
メソッドを使うと、オブジェクト自体に「合計出してね」というと出してくれる、
って感じです。
このほうがオブジェクトの中ですべて処理してくれるので、考えやすいです。
といってもなかなかわかりづらいので色々試して使ってみてください。