高度なオブジェクト作成 (JScript)
更新 : 2007 年 11 月
JScript では、プロトタイプ ベースのオブジェクトで継承がサポートされています。プロトタイプ べースのオブジェクトは、継承を利用して、動的に追加および削除できる共通のプロパティとメソッドのセットを共有できます。また、各オブジェクトは既定の動作をオーバーライドできます。
プロトタイプ ベースのオブジェクトの作成
プロトタイプ ベースのオブジェクトのインスタンスを作成するには、最初にコンストラクタ関数を定義する必要があります。詳細については、「コンストラクタ関数による独自のオブジェクトの作成」を参照してください。コンストラクタを記述したら、プロトタイプ オブジェクトを使用して、継承されたプロパティと共有メソッドを作成できます。プロトタイプ オブジェクトは、それ自体が各コンストラクタのプロパティになります。コンストラクタはインスタンス固有の情報をオブジェクトに提供しますが、プロトタイプ オブジェクトはオブジェクトに固有の情報とメソッドをオブジェクトに提供します。
メモ : |
---|
オブジェクトのすべてのインスタンスに影響を与えるには、コンストラクタの prototype オブジェクトに変更を加える必要があります。オブジェクトのいずれかのインスタンスのプロトタイプ プロパティを変更しても、同じオブジェクトの他のインスタンスには影響がありません。 |
プロトタイプ オブジェクトのプロパティおよびメソッドは、オブジェクトの各インスタンスに参照渡しでコピーされます。したがって、すべてのインスタンスが同じ情報にアクセスします。1 つのインスタンスでプロトタイプ プロパティの値を既定値から変更しても、他のインスタンスは変更の影響を受けません。カスタム コンストラクタの Circle を使用する例を次に示します。this ステートメントは、メソッドでオブジェクトのメンバにアクセスできるようにします。
// Define the constructor and add instance specific information.
function Circle (radius) {
this.r = radius; // The radius of the circle.
}
// Add a property the Circle prototype.
Circle.prototype.pi = Math.PI;
function ACirclesArea () {
// The formula for the area of a circle is pi*r^2.
return this.pi * this.r * this.r;
}
// Add a method the Circle prototype.
Circle.prototype.area = ACirclesArea;
// This is how you would invoke the area function on a Circle object.
var ACircle = new Circle(2);
var a = ACircle.area();
この方法を使って、既存の (プロトタイプ オブジェクトを持つ) コンストラクタ関数に対して、追加のプロパティを定義できます。この操作は高速モードがオフの場合にだけ有効です。詳細については、「/fast」を参照してください。
たとえば、Visual Basic の Trim 関数のように、文字列の先頭または末尾のスペースを削除する場合は、String プロトタイプ オブジェクトに独自のメソッドを作成して、スクリプト内のすべての文字列がこのメソッドを自動的に継承するようにできます。この例では、正規表現リテラルを使用して空白を削除しています。詳細については、「Regular Expression オブジェクト」を参照してください。
// Add a function called trim as a method of the prototype
// object of the String constructor.
String.prototype.trim = function() {
// Use a regular expression to replace leading and trailing
// spaces with the empty string
return this.replace(/(^\s*)|(\s*$)/g, "");
}
// A string with spaces in it
var s = " leading and trailing spaces ";
print(s + " (" + s.length + ")");
// Remove the leading and trailing spaces
s = s.trim();
print(s + " (" + s.length + ")");
/fast- フラグを指定してこのプログラムをコンパイルすると、出力は次のようになります。
leading and trailing spaces (35)
leading and trailing spaces (27)