javascriptの中で種類のいくつかの方法を定義します.


javascriptにはいくつかの定義類の方式がありますが、以下にそれぞれその問題点を挙げて説明します.中にHybrid constructor/prototype方式は採用を推奨する方式です.
1.Factory
工場関数を定義して、関数で新しいオブジェクトを作成し、属性と方法を定義して、オブジェクトを返します.
以下は工場関数の例です.

function createCar() {
	var oTempCar = new Object;
	oTempCar.color = "red";
	oTempCar.doors = 4;
	oTempCar.mpg = 23;
	oTempCar.showColor = function () {
		alert(this.color)
	};
	
	return oTempCar;
}
新しいオブジェクトを作成するコードはこのようです.

var oCar1 = createCar();
var oCar2 = createCar();
このように、新しいオブジェクトを作成するたびに、新しい方法のshowColorのコピーが発生するという問題があります.

function showColor() {
	alert(this.color);
}

function createCar(sColor, iDoors, iMpg) {
	var oTempCar = new Object;
	oTempCar.color = sColor;
	oTempCar.doors = iDoors;
	oTempCar.mpg = iMpg;
	oTempCar.showColor = showColor;
	return oTempCar;
}
2.コンストラクタ
コンストラクタの書き方は工場の方法と似ていますが、newを使ってオブジェクトを作成することができます.コード例は次の通りです.

function Car(sColor, iDoors, iMpg) {
	this.color = sColor;
	this.doors = iDoors;
	this.mpg = iMpg;
	this.showColor = function () {
		alert(this.color)
	};
}

var oCar1 = new Car("red", 4, 23);
var oCar2 = new Car("blue", 3, 25);
方法showColorについては同じ問題がありますが、同じ方法でこの問題を解決することもできます.
3.Prottotype
Objectのprototype属性を利用してクラスを定義できます.以下は例示コードです.

function Car() {
}

Car.prototype.color = "red";
Car.prototype.doors = 4;
Car.prototype.mpg = 23;
Car.prototype.showColor = function () {
	alert(this.color);
};

var oCar1 = new Car();
var oCar2 = new Car();
このように新たに作成されたオブジェクトの属性と方法は同じ例を指し、この方法については異なるコピーを作成する問題を解決したが、属性については、オブジェクトの属性を変更すると同時に他のオブジェクトの属性に影響を与えるという重大な問題である.だからconstructor/prototypeの混ぜ方を使います.
4.Hybrid constructor/prototype
この方法はプロトタイプを用いて方法を定義するもので、方法以外の要素はコンストラクタで定義されています.例示的なコードは以下の通りです.

function Car(sColor, iDoors, iMpg) {
	this.color = sColor;
	this.doors = iDoors;
	this.mpg = iMpg;
	this.drivers = new Array("Mike", "Sue");
}

Car.prototype.showColor = function () {
	alert(this.color);
};

var oCar1 = new Car("red", 4, 23);
var oCar2 = new Car("blue", 3, 25);
5.Dynamic prototype
このような方法はjavaに似ています.例示的なコードは以下の通りです.

function Car(sColor, iDoors, iMpg) {
	this.color = sColor;
	this.doors = iDoors;
	this.mpg = iMpg;
	this.drivers = new Array("Mike", "Sue");
	
	if (typeof Car._initialized == “undefined”) {
		Car.prototype.showColor = function () {
			alert(this.color);
		};
		Car._initialized = true;
	}
}