Share via


高度なオブジェクト作成

コンストラクタは、特定の種類のオブジェクトをインスタンス化し、初期化するために呼び出す関数です。コンストラクタを呼び出すには、new キーワードを使用します。次に、コンストラクタの使用方法をいくつか示します。

var myObject = new Object();             // 一般的なオブジェクトをプロパティなしで作成します。
var myBirthday = new Date(1961, 5, 10);  //Date オブジェクトを作成します。
var myCar = new Car();                   // ユーザー定義のオブジェクトを作成し、そのプロパティを初期化します。

コンストラクタには、新規作成された空のオブジェクトに対する参照が、特殊キーワード this の値として渡されます。これにより、コンストラクタは新規オブジェクトに対してプロパティを作成し、初期値を指定するなど、適切な初期化処理の実行を受け持ちます。初期化が終了すると、オブジェクトに対する参照がコンストラクタから返されます。

コンストラクタを記述する

Object()、Date()、および Function() のような既定義のコンストラクタ関数と new 演算子を組み合わせ、オブジェクトを作成し、初期化することができます。オブジェクト指向型プログラミングの強力な機能の 1 つとして、カスタム コンストラクタ関数を定義し、自分の記述するスクリプト内で使用するカスタム オブジェクトを作成できるという点を挙げることができます。カスタム コンストラクタでは、あらかじめ定義済みのプロパティを持つオブジェクトも作成可能です。次に、カスタム コンストラクタの例を示します。this キーワードの用法に注意してください。

function Circle (xPoint, yPoint, radius) {
this.x = xPoint;  // 円の中心点の x 要素。
this.y = yPoint;  // 円の中心点の y 要素。
this.r = radius;  // 円の半径。
}

Circle コンストラクタを起動する際、円の中心点と半径の値を指定しています。これらの値を指定することで、作成する円は完全に一意な円オブジェクトとなります。この結果、3 つのプロパティを持つ Circle オブジェクトが作成されます。以下に示すのは、Circle オブジェクトをインスタンス化する例です。

var aCircle = new Circle(5, 11, 99);

オブジェクトの作成にプロトタイプを使う

コンストラクタを記述する際には、それ自体が各コンストラクタのプロパティであるプロトタイプ オブジェクトを使用し、プロパティを継承し、メソッドを共有することができます。プロトタイプ プロパティおよびメソッドは、同じクラスの各オブジェクトに参照渡しでコピーされるため、すべて同じ値を持つことになります。各オブジェクトでプロトタイプ プロパティの値を変更し、そのインスタンス内で既定値を新しい値に変更できます。この場合、この変更によって同じクラスに属するほかのオブジェクトに影響を及ぼすことはありません。次に示すのは、カスタム コンストラクタ Circle を使用した例です。this キーワードの用法に注意して見てください。

Circle.prototype.pi = Math.PI;
function ACirclesArea () {
return this.pi * this.r * this.r; // 円の面積を求める式は πr2 です。
}
Circle.prototype.area = ACirclesArea; // 円の面積を求める式が、プロトタイプ オブジェクト Circle のメソッドとなりました。
var a = ACircle.area();               // Circle オブジェクトで面積を求める関数を起動します。

あらかじめ定義されているコンストラクタ関数すべてに、プロトタイプ オブジェクトが用意されています。この原理を使うと、これらの関数に追加プロパティを定義できます。たとえば、VBScript の Trim 関数での処理のように、文字列の先頭、または末尾のスペースを削除できるようにしたい場合、プロトタイプ オブジェクト String に独自のメソッドを作成すれば、記述するスクリプト内の全文字列がこのメソッドを継承することになります。

// trim と呼ばれる関数を
// String コンストラクタのプロトタイプ オブジェクトにメソッドとして追加します。
String.prototype.trim = function()
{
// 先頭、または末尾のスペースを空の文字列で置換するには、
// 正規表現を使用します。
    return this.replace(/(^\s*)|(\s*$)/g, "");
}

// 次に示すように前後にスペースのある文字列は
var s = "    前後にスペースがあります    ";

// "    前後にスペースがあります     (35)" のように表示されます。
window.alert(s + " (" + s.length + ")");

// 前後のスペースを削除すると、
s = s.trim();
// "前後にスペースがあります (27)" のように表示されます。
window.alert(s + " (" + s.length + ")");