__proto__プロパティ

1つ目の脱線。


JavaScript の配列と連想配列の違い - IT戦記

このエントリで配列の説明がこうあります。

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

こうなっちゃう。

たぶん自分の場合このケースの定義になるかな。

どんな時に活用できるかなぁ