__proto__プロパティ
1つ目の脱線。
このエントリで配列の説明がこうあります。
var array = { 0: 'hoge', 1: 'fuga', length: 2 }; array.__proto__ = Array.prototype;
なるほどー
lengthはDontEnum プロパティだから走査されない!
で、__proto__ってなに?
コンストラクタ関数とともに new 演算子を用いて新しいオブジェクトを作成するとき、JavaScript は新しいオブジェクトの __proto__ プロパティにコンストラクタ関数の prototype プロパティの値をセットします。
http://developer.mozilla.org/ja/Core_JavaScript_1.5_Guide/Property_Inheritance_Revisited/Determining_Instance_Relationships/
・・・
よくわからんのでここで試そ
http://javascriptist.net/exec/
var f=function(){var f='f'} f.prototype.a=1; var ff=new f(); alert(ff.constructor.prototype==ff.__proto__) //true
こういうことらしい。
ちなみに継承した場合は、
var f=function(){} f.prototype.a=1; var ff=new f(); alert(ff.constructor.prototype==ff.__proto__)//true var z=function(){} z.prototype=ff var zz=new z(); alert(zz.constructor.prototype.constructor==zz.__proto__.constructor)//true
となる。なるほど
ただし、ご先祖様の定義を
f.prototype={a:1}
こうしちゃうと、
var f=function(){} f.prototype={a:1} var ff=new f(); alert(ff.constructor.prototype==ff.__proto__)//false var z=function(){} z.prototype=ff var zz=new z(); alert(zz.constructor.prototype.constructor==zz.__proto__.constructor)//true
こうなっちゃう。
たぶん自分の場合このケースの定義になるかな。
どんな時に活用できるかなぁ