JavaScriptでクラスを実現する方法

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() {}