継承するとまた少しおもしろいことがわかってくる?
前のエントリにからんで、いろいろ試していたことをおまけ的に載せておく。
継承するときに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なんて評価をいれてたらここまで
わかってないと(わかってなかったらつかわないかな)ハマっていく原因になるな。