[JavaScript] prototypeを変更する意味

すべての関数にあるprototypeオブジェクトを利用すると、オブジェクト指向的なことができる。

prototypeに入れる変数・関数を変更すると、すべてのインスタンスに適用される。

function Sample() {
	//...
}

var firstInstance = new Sample;
var secondInstance = new Sample;

Sample.prototype.num = 1;

alert(firstInstance.num);
alert(secondInstance.num);
// 1, 1

【@要注意】 prototypeにすでにあるメンバ・メソッドの中身を変更すると、すべてのインスタンスのそれが変更される。

function Sample() {
	//...
}

Sample.prototype.num = 1;

var firstInstance = new Sample;
firstInstance.num = 2;

var secondInstance = new Sample;
secondInstance.num = 3;

Sample.prototype.num = 4;

alert(firstInstance.num);
alert(secondInstance.num);
// 4, 4

ユーザー定義の関数だけでなく、標準機能のオブジェクトのprototypeも変更可能。

var arr = [1, 2, 3];

Array.prototype.push = function (val) {
	this.unshift(val);
}

arr.push(100);

alert(arr);
// 100, 1, 2, 3

この場合、prototypeが変更されるだけでなく、すでに生成されているすべてのArrayオブジェクトのインスタンスの値/オブジェクトもも変更される。

非常に柔軟性が高いが、それゆえのリスクも高いので使う場面に気をつけよう。