m2

prototype の解釈を間違ってました

僕はインスタンスに該当プロパティがなければコンストラクタの prototype プロパティの該当プロパティを参照すると思っていました。正確には"インスタンス化された時の"コンストラクタの prototype プロパティの該当プロパティを参照しているようです。

元ネタ。

web newbie - Javascript初心者からみたprototype
http://d.hatena.ne.jp/yupug/20070413/1176472206

以下のスクリプトで確認しました。(__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
})()

bookmarklet:

それぞれのインスタンスはコンストラクタ((あれ? 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 オブジェクトっぽいことができるなあと思いました。特に有効だとは思わないけど。