JavaScriptはクラスをサポートしないため、ここで解説するのは正確な意味でのクラスとは異なるものです。
functionキーワードを用いて定義します。これは通常の関数を定義する構文と同一です。
// クラス (コンストラクタ) function MyClass( a ) { // プロパティ this.property = a; // returnを記述してはならない }
クラスの定義時に、thisキーワードを介して定義します。
クラスのprototypeプロパティに、関数リテラルの構文で定義します。ちなみにこのprototypeプロパティは、Objectクラスから継承されるものです。
MyClass.prototype.Method = function() {}
またオブジェクトリテラルの構文を使用することで、複数のメソッドを続けて定義できます。
MyClass.prototype = {
Method1 : function()
{
},
Method2 : function( a )
{
this.a = a;
}
}
クラス定義を行った関数が、コンストラクタとなります。
// クラス (コンストラクタ) function MyClass() { // returnを記述してはならない }
またオブジェクトのコンストラクタはconstructorプロパティで参照できます。
var myClass = new MyClass();
if( myClass.constructor == MyClass )
{
}
言語仕様として、デストラクタはサポートされていません。
終了処理を行う必要があるならばそれを行うメソッドを定義し、そのメソッドを明示的に呼び出すようにします。
これらはインスタンスではなく、クラスそのものに関連付けられたメンバです。C++を例にするならば、static属性を付けた静的メンバに相当します。
// クラス function MyClass() { } // クラスプロパティ MyClass.classProperty; // クラスメソッド MyClass.ClassMethod = function() {}
// スーパークラス
function SuperClass( property1, property2 )
{
this.property1 = property1;
this.property2 = property2;
}
SuperClass.prototype.Foo = function() {}
// サブクラス function SubClass( property1, property2, property3 ) { // スーパークラスのコンストラクタを呼び出し、スーパークラスのプロパティを初期化する SubClass.call( this, property1, property2 ); // 新しいプロパティを追加する this.property3 = property3; } // スーパークラスのサブクラスとなるように、プロトタイプオブジェクトを生成する SubClass.prototype = new SuperClass(); // サブクラスのコンストラクタが参照されるように、既定のconstructorプロパティを書き換える SubClass.prototype.constructor = SubClass; // 継承したくないプロパティを、サブクラス側で削除する delete SubClass.prototype.property1; // 新しいメソッドを追加する SubClass.prototype.Bar = function() {}