JavaScriptにおけるオブジェクト指向

JavaScriptのオブジェクト指向

JavaScriptのオブジェクト指向ではインスタンス化/インスタンスという概念はあるもののJavaC#でいうクラスというものがありません。あるのは実体化されたオブジェクトだけであり、新しいオブジェクトを生成するときも既存のオブジェクトが元になっています。

定義例


//コンストラクタとプロパティの定義
var Person = function(firstName, lastName){
    this.firstName = firstName;
    this.lastName = lastName; 
}

//メソッドの定義
Person.prototype.getName = fuction(){
    return this.lastName + this.firstName;
}


変数Personに代入される関数がコンストラクタ、その中身のthis.〇〇〇がプロパティとなります。prototypeプロパティはオブジェクトにメンバーを追加するためのプロパティでここに格納されたメンバーはそのオブジェクトを元にしたインスタンスから利用することができます。prototypeプロパティに追加されたメンバーはインスタンスから暗黙的に参照され、インスタンスにコピーされないためメモリの使用量を減らすことができます。

インスタンス化とプロパティ・メソッドの呼び出し


//インスタンス化
var a = new Person(‘太郎’, ‘山田’);

console.log(a.getName());//結果:山田太郎


変数名.プロパティ名、変数名.メソッド名で呼び出すことができる。

継承


//継承元
var Parent = function(n){ 
    this.x = n;
    this.y = n * 2;
}
Parent.prototype.print = function() {
    console.log("x = " + this.x + ",y = " + this.y);
}

//継承先
var Child = function(n){ 
    Parent.call(this, n);//親オブジェクトのコンストラクタ呼び出し
}

Child.prototype = new Parent();//親オブジェクトのインスタンスをセット

var test = new Child(2);
test.print();//結果:x = 2,y = 4


継承するオブジェクトのインスタンスを継承先のprototypeにセットすることで親オブジェクトに定義されたメソッドを呼び出すことができる。

class命令

上記のようにJavaScriptのオブジェクト指向では独特なクラス定義を書く必要がありましたがES2015からclass命令が導入され、以下のような定義が可能となりました


class Person{
    //コンストラクタ
    constructor(firstName, lastName)    {
        this.firstName = firstName;
        this.lastName = lastName;
    }
    //メソッド
    getName(){
        return this.lastName + this.firstName;
    }
}

また、extendsキーワードを使うことで既存のクラスを継承したサブクラスを定義できます。


//親クラス
class Parent{
    constructor(n){
        this.x = n;
        this.y = n * 2;
    }

    print(){
        console.log("x = " + this.x + ",y = " + this.y);
    }
}
//子クラス
class Child extends Parent{
    constructor(n){
        //親クラスのコンストラクタの呼び出し
        super(n);
    }
}


public/protected/private のようなアクセス修飾子は利用できないなど注意する点もありますがJavaやC#の経験者であれば理解しやすいものとなっています。