JavaScript では標準で用意されている型(クラス)のほか、function を用いてユーザー定義のクラスを定義することができます。下記では、Person というクラスを定義しています。これは name と age を属性(プロパティ)として持ち、toString() を動作(メソッド)として持ちます。toString() は、すべてのクラスに共通な toString() メソッドを上書き(オーバーライド)するものです。
function toStringOfPerson() { return (this.name + " / " + this.age); } function Person(name, age) { this.name = name; this.age = age; this.toString = toStringOfPerson; }
Person() 関数は Person クラスの生成関数(コンストラクタ)として扱われます。Person オブジェクトの実体(インスタンス)を生成するには new 演算子を用います。
var p1 = new Person("Suzuki", 26); document.write(p1.name + "<br>"); document.write(p1); // write()でtoString()が暗黙的に呼ばれる
メソッド定義の部分は次のように記述することも可能のようです。
function Person(name, age) { this.name = name; this.age = age; this.toString = function () { return (this.name + " / " + this.age); } }
Internet Explorer 4.0 や Netscape Communicator 4.0 以降では、下記のようにして、簡易的にオブジェクトを生成することもできます。
var xx = { name: "Suzuki", age: 26 }; document.write(xx.name + "<br>"); document.write(xx.age + "<br>");
Netscape Communicator 4.06 以降では、call() や apply() を用いて、Person のサブクラス Person2 や Person3 を作成することができます。引数固定の場合は call()、可変個引数の場合は apply() を用います。
function Person2(name, age, email) { this.email = email; Person.call(this, name, age); } function Person3(/* ..., email */) { this.email = arguments.pop(); Person.apply(this, arguments); }
Person2 や Person3 クラスは Person クラスを継承しているので、name 属性、age 属性、toString() メソッドなど、親のクラスが持っている機能をすべて使用することができます。
var x2 = new Person2("Suzuki", 26, "suzuki@xxx.yyy.zzz"); document.write(x2); // PersonのtoString()が暗黙的に呼ばれる
new を用いてオブジェクトを生成します。new Object() も使用できますが、通常は Date などの既存オブジェクトや、上記のユーザ定義オブジェクトを使用したりします。下記に示すプロパティやメソッドは、すべてのクラスのオブジェクトに対して利用可能です。
オブジェクトの生成関数(コンストラクタ)を示します。
このオブジェクトタイプに新しい属性を動的に定義します。Number や String や Function で作成したユーザー定義オブジェクトなど、すべてのオブジェクトタイプに対して使用できます。
Date.prototype.type = null; dd = new Date(); dd.type = "開始時刻"; document.write(dd.type);
string を JavaScript コードと見なして実行します。JavaScript 1.4 では削除されました。代わりに eval() を用います。
オブジェクトを文字列に変換する際に用いられます。オブジェクトの種類や JavaScript のバージョンによって文字列のフォーマットは異なります。このメソッドは、オブジェクトを文字列に変換する必要がある時に暗黙的に呼ばれます。以下のようにしてこのメソッドを上書きすることも可能です。
// 日付を YYYY/MM/DD HH:MM:SS 形式に変換する function myToString() { var year = this.getYear(); var mon = this.getMonth() + 1; var date = this.getDate(); var hour = this.getHours(); var min = this.getMinutes(); var sec = this.getSeconds(); if (year < 2000) { year += 1900; } if (mon < 10) { mon = "0" + mon; } if (date < 10) { date = "0" + date; } if (hour < 10) { hour = "0" + hour; } if (min < 10) { min = "0" + min; } if (sec < 10) { sec = "0" + sec; } return(year + "/" + mon + "/" + date + " " + hour + ":" + min + ":" + sec); } Date.prototype.toString = myToString; dd = new Date(); document.write(dd); // YYYY/MM/DD HH:MM:SS 形式で表示される
オブジェクトの中身の値を得ます。toString()だと [object Object] としか表示されなかったところを、{name:"Suzuki", age:28} や { "AA", "BB", "CC" } などのように、オブジェクトのプロパティまで得ることができます。