継承するとまた少しおもしろいことがわかってくる?

前のエントリにからんで、いろいろ試していたことをおまけ的に載せておく。
継承するときにprototype.constructorの参照を再設定する理由が
わかった。

おさらいついでに継承なしで。

//construcotrはFunction、prototype.constructorはChild
function Child(){};
//constructorはChild、prototype.constructorはなし
var child = new Child();

とまあこれは理解できた。

親登場!継承してみる。

function Parent(){}
function Child(){}
Child.prototype = new Parent();
var child = new Child();

さてここでchildのconstructorはなにか?
実は、ChildでなくParentになっている。
これは前のエントリに書いたとおり
コンストラクタ関数のprototype.constructorが設定されるを考えると
納得できる。
Child.prototype = new Parent();
がミソ。
これによってChild.prototype.constructorは
Parent.prototype.constructor、つまりParentが設定されている。
だから、child.construcotrがParentになっている。

厳密に継承関係を作ると

上記をふまえて継承をちゃんとやると

function Parent(){}
function Child(){}
Child.prototype = new Parent();
Child.prototype.constructor = Child;//明示的に参照を直してあげる

としなければいけなかったんだー。

(余談)ということは?わりと見かけるこれは?

たまーにこんなソースを見かける。

function Hoge(){}
Hoge.prototype = {
    func1:function(){},
    func2:function(){}
};
var hoge = new Hoge();

とすると、hogeのconstructorプロパティはHogeでなく
Objectになってしまっている。これはオブジェクトリテラル書いてるから
Objectを継承していることになる。
そんなに神経質に考えなくてもいいんだろうけど。
hoge.constructor == Hogeなんて評価をいれてたらここまで
わかってないと(わかってなかったらつかわないかな)ハマっていく原因になるな。