Javascriptのクラス

javascript-class.png

javascriptにはもともとクラスという概念がありません。
しかしjavascript既存の機能を利用してクラスっぽい書き方をすることが出来ます。
C++やJavaでクラスを利用したことのある人は戸惑うかもしれませんが、
ルールを覚えてjavascriptでクラスを使いこなしましょう~

クラスの宣言

javascriptにはクラスがないので、代わりにクラスの名前をした関数として宣言します
/**
 * クラスの概要説明
 * @class
 * @extends 親クラスの名前
 */
function クラス名()//コンストラクタ
{
    this.メンバ変数=1;
}

こう書いておくと
var クラスインスタンス = new クラス名();

でクラスを利用することができます。
こういう定義の仕方も出来ます。
var square = {buffer:vertexBuffer, vertSize:3, nVerts:4, primtype:gl.TRIANGLE_STRIP};

これは辞書とも呼ばれます。
JavaScript のオブジェクトは基本的には key と value のペアを保持する単なるマップ (連想配列) だからです。

まとめ

  • javascriptにはクラスは存在しないが、連想配列をクラスっぽく利用することができる
  • javascriptにはコンストラクタもないが、クラス名をした関数を定義することでクラスのコンストラクタっぽいものを作成することができます。

メンバ関数の書き方

基本構文

クラス名.prototype.メンバ関数名 = function(){
    //内容
}
// メソッドはコンストラクタの prototype プロパティに定義します
Person.prototype.getName = function() {
  // メンバ変数の定義・参照は this.<メンバ変数> を使います。
  // C++, Java と違い this は省略できません。
  return this.name;
};
// メソッドはコンストラクタの prototype プロパティに定義します
Person.prototype.getName = function() {
  // メンバ変数の定義・参照は this.<メンバ変数> を使います。
  // C++, Java と違い this は省略できません。
  return this.name;
};

メンバの参照

javascriptのクラスは本質的には連想配列なので
登録した値は obj['prop'] あるいは obj.prop のように参照できます。
参照されたキーが存在しない場合は undefined が返されます。
obj.propという参照の仕方の方がC++やjavaのクラスっぽいですね

javascriptの継承

prototypeというキーワードを使う。

コンストラクタの書き方

function 子クラス()//子クラスのコンストラクタ
{
    親クラス.call(this);//親クラスのコンストラクタを呼び出す
}

javascriptのcall関数は元々、関数を呼び出すための関数です。
が、この使い方はコンストラクタを連鎖させるために call メソッドを使用しています。
コンストラクタを用いてオブジェクトを生成する際に、call を用いることで Java のようにコンストラクタによる初期化を連鎖させることができます。

引数付きコンストラクタの場合

function 子クラス()//子クラスのコンストラクタ
{
    親クラス.call(this,引数1,引数2);//親クラスのコンストラクタを呼び出す
}

子クラス.prototype = Object.create(親クラス.prototype);
子クラス.prototype.constructor = 子クラス;
module.exports = 子クラス;

継承は inherits という関数を用意して次のように行います。
var inherits = function(childCtor, parentCtor) {
  // 子クラスの prototype のプロトタイプとして 親クラスの
  // prototype を指定することで継承が実現される
  Object.setPrototypeOf(childCtor.prototype, parentCtor.prototype);
};
 
// 子クラスのコンストラクタ
var Employee = function(name, age, salary) {
  // 親クラスのコンストラクタの呼び出しには call を使用
  Person.call(this, name, age);
  this.salary = salary;
};
 
// inherits を使って親子関係を明示する
inherits(Employee, Person);
 
// 子クラスのメソッド
Employee.prototype.getSalary = function() {
  return this.salary;
};
 
// 同じ名前のメソッドを子クラスで定義すればオーバーライドになる。
Employee.prototype.sayHello = function() {
  // 親クラスのメソッドを呼び出す場合は親クラスの prototype に
  // 定義されているメソッドを call を使って呼び出す。
  Person.prototype.sayHello.call();
  console.log('Salary is ' + this.salary);
};

子クラスから親クラスのメソッドが引き継がれるようにするには、 子クラスの prototype にメソッドが見つからなかった場合に、親クラスの prototype に定義されてるメソッドが参照されれば良いので、 親クラスの prototype が子クラスの prototype のプロトタイプ (proto, あるいは [[Prototype]])になるようにします。

サポートサイト Wikidot.com