Engineer as a Lifestyle @tenkoma

What We Find Changes Who We Become -- Peter Morville著『アンビエント・ファインダビリティ 』

プロトタイプ

JavaScript 第5版 p.154
プロトタイプを理解するまでの流れ

  • 関数には最初からprototypeプロパティがついてくる。
function Hoge(prop){
    this.prop = prop;
}
Hoge.prototype.get = function(){ return this.prop; }

newして呼びだす関数のことをコンストラクタ関数と呼ぶ。不思議なことにreturn文がなくても値が返ってきて、それはオブジェクトになっている。

var a = new Hoge(3);

関数にはすべて、prototypeプロパティと言うのがあり、Hoge.prototype.getプロパティを定義すると、a = new Hoge(...)したあとで、a.get()のように書いて、Pythonのメソッドのようにオブジェクトにアクセスさせることができる。
もちろん、

function Hoge(prop){
    this.prop = prop;
    this.get = function(){
        return this.prop;
    }
}

という風に書いても、同じ事ができる。が、このやりかたは、get関数がインスタンスごとにコピーされるので非効率だとのこと。一方prototypeオブジェクトに書けば、コピーはされずに、new Hoge()されたオブジェクトで共有される。これを本では継承と呼んでいる。JavaScriptインタプリタはa.get()と書けば、まず、aインスタンスにgetプロパティがないか探して、無かった場合はprototypeプロパティを探しにいく。
prototypeプロパティは共有されているので、沢山newしたあとでprototypeプロパティのプロパティを書き換えると、それまでに生成されたインスタンスの挙動を変えることが出来る。…が、そんなことをすると混乱することが増えるのでやらないほうがいいらしい。