prototypeについて

prototypeで定義すると元の関数を共有するみたい。
(元の関数を書き換えると、 new で作成されたオブジェクトの関数も書き換わる)

function obj(){
	this.m = function(i){return i};
}

function proto_obj(){
	proto_obj.prototype.m = function(i) i;
}

p1 = new obj();
p2 = new obj();
np1 = new proto_obj(); //prototypeを使ってる
np2 = new proto_obj();

//method m を変更
function mm(i){return i * i};
function mmm(i){return i * i * i}
function display(t, str){
	print("==", str, "==");
	let(str = "e.m(10)"){
 		Array.forEach(t, function(e){ print(str, " : ", eval(str))});
	}
}							 
var a = [p1,p2,np1,np2];
display(a, "最初")
p1.m = mm;
np1.m = mm;
display(a, "p1, np1オブジェクトがもっているメソッドを書き換えた")
obj.prototype.m = mmm;
proto_obj.prototype.m = mmm;
display(a, "元の関数のprototypeを書き換えた。")

// == 最初 ==
// e.m(10)  :  10  //p1
// e.m(10)  :  10  //p2
// e.m(10)  :  10   //np1
// e.m(10)  :  10   //np2
// == p1, np1オブジェクトがもっているメソッドを書き換えた ==
// e.m(10)  :  100
// e.m(10)  :  10
// e.m(10)  :  100
// e.m(10)  :  10
// == 元の関数のprototypeを書き換えた。 ==
// e.m(10)  :  100
// e.m(10)  :  10
// e.m(10)  :  100 //一つ前でmmに変更したことで結びつきが消えた。
// e.m(10)  :  1000