コンストラクタの定義
function Person(firstname, lastname, sex, age)
{
this.firstname = firstname;
this.lastname = lastname;
this.sex = sex;
this.age = age;
}
pary[0] = new Person("小泉", "純一郎", 0, 87);
pary[1] = new Person("森", "喜朗", 0, 85);
pary[2] = new Person("小渕", "恵三", 0, 84);
pary[3] = { firstname:"橋本", lastname:"隆太郎", sex:0, age:83 }; // オブジェクトリテラルによる記述
pary[0].shijiritsu = 80;
pary[1].shijiritsu = 30;
pary[2].shijiritsu = 45;
pary[3].shijiritsu = 40;
※このとき、定義したオブジェクトに元々'shijiritsu'というプロパティは無かったことに注目。
参考O'Reillyの「JavaScript」
■オブジェクト
複数のデータ値をまとめて、これらに名前を使ってアクセスできるもの。プロパティの集合体。
■プロパティ
オブジェクトの定義がプロパティの集合体ならば、当たり前であるがオブジェクトの属性。
オブジェクト名.プロパティ名でアクセスできる。
例)o.width
o.height
■オブジェクトの生成
new演算子で生成する。
new コンストラクタ関数名()
例)var o = new Rectangle();
■コンストラクタ
オブジェクトを生成したときに初期化のために呼び出される関数。というかオブジェクトの定義はこれでしかない。
new演算子で呼び出される。
コンストラクタの中でのそのオブジェクト自身への参照は'this'キーワードを使う。
例)
function Rectangle(w, h) {
this.width =w;
this.height = h;
}
■メソッド
オブジェクトを介して呼び出す関数。
例)
メソッドとなる関数の定義
function area() {
return this.width * this.height;
};
コンストラクタの中
function Rectangle(w, h) {
this.width =w;
this.height = h;
this.area = area; // メソッドの定義
呼び出し方
new o = Rectngle(80, 40);
a = o.area(); <- 3200が返る
■プロトタイプ
変化しない定数や、メソッドをコンストラクタの中で定義するとそれらはインスタンス毎にメモリを消費してしまう。
これをプロトタイプオブジェクトとして別途定義し、それを継承することによってメモリの消費をおさえることができる。
アクセスは、オブジェクト名.prototype.プロパティ のように行われる。
例)
Circle.prototype.pi = 3.14 // プロトタイプへのプロパティへの値の登録
fucntion Circle_circumference() { return 2 * this.pi * thie.r; } // メソッドの定義
Circle.prototype.circumfernce = Circle_circumference; // プロトタイプへのメソッドの登録
以上のようにプロトタイプを設定したあとでこのオブジェクトのインスタンスを生成する。
o1 = new Circle(...);
o2 = new Circle(...);
プロトタイプと、コンストラクタで同じプロパティを定義した場合はコンストラクタ内で定義したものが有効になる。
※プロパティに値を書き込むときはプロトタイプではなくオブジェクト内のプロパティに書き込まれる。
プロパティが定義されていないときは自動的に生成される。
例)
o1.pi = 3;
のように定義するとオブジェクトにプロパティが追加され o1.pi は、3.14ではなく 3 となる。
あらかじめコンストラクタでpiを定義していた場合も同じである。
また、Circle.prototype = new コンストラクタ名() とすることにより、他のオブジェクトを継承させることもできる。
例)CircleオブジェクトからsubCircleオブジェクトを派生する場合
subCircle.prototype = new Circle();
※ただし、このときconstructorプロパティが上書きされてしまうとのこと。詳細はP151。
■スーパークラスとサブクラス
全てのオブジェクトはObjectクラスのサブクラスである。