prototype の解釈を間違ってました
僕はインスタンスに該当プロパティがなければコンストラクタの prototype プロパティの該当プロパティを参照すると思っていました。正確には"インスタンス化された時の"コンストラクタの prototype プロパティの該当プロパティを参照しているようです。
元ネタ。
以下のスクリプトで確認しました。(__proto__プロパティが参照できるのは Firefox のみ)
(function(){ var Box=new Function(); Box.prototype={c:'red'}; var b1=new Box(); alert(b1.c+':'+(b1.__proto__==Box.prototype)); // red:true Box.prototype={c:'blue'}; alert(b1.c+':'+(b1.__proto__==Box.prototype)); // red:false var b2=new Box(); alert(b2.c+':'+(b2.__proto__==Box.prototype)); // blue:true })()
それぞれのインスタンスはコンストラクタ((あれ? b2.constructor
はそもそも Box じゃなくて Object だ。これも勘違いしてた。追記:{}.__proto__.constructorを参照してる))から prototype を参照するのではなくて、prototype への参照を(Firefoxでは__proto__に)直接持っているのですね。だからインスタンス化した後にクラスの prototype を丸ごと置き換えても、インスタンス化した時点の prototype を保持できる、と。
b1.c ⇒ Box.prototype.c じゃなくて b1.c ⇒ (b1.__proto__.c ⇒) {c:'red'}.c
とすると prototype を上書きすることで、Java の final オブジェクトっぽいことができるなあと思いました。特に有効だとは思わないけど。