prototype拡張時のうっかり
今まであまり意識していなかったこともあり,最初???な挙動だったので念のためメモ.
なんでコイツはnewしたあとに,constructor.nameがObjectになってしまうのかしら,という疑問が発端.
protototypeに直接オブジェクトを代入していた
わりと自然にミスしてました.
function Hogehoge() { // some logic } Hogehoge.prototype = { prop : 123, method : function() {} }; console.log(new Hogehoge().constructor.name); // -> Object
prototypeにObjectをガッツリ代入してました…prototypeがconstructorになるんですね.prototypeにObjectを代入したことで、constructorも置き換わってしまう.
実際はHogehoge.prototypeにObjectを代入してもHogehoge自体は元の関数なせいか,newできますし,その中のロジック+prototypeに突っ込まれた分のメソッドも問題なく動作します.
パッと見で普通に動作してしまったので,constructorだけなぜObjectなのか気づくの遅れました・・・
正しくはこう
ですね.
function Hogehoge() { // some logic } Hogehoge.prototype.prop = 123; Hogehoge.prototype.method : function() {}; console.log(new Hogehoge().constructor.name); // -> Hogehoge
ばっちりです.
オブジェクト合成的なアレ
Hogehoge.prototype.XXX = YYY
を繰り返すのは記述的にアレなので,下記のように消極的なオブジェクト合成的なアレを挟みます.
function fill(base, ext) { var k; for (k in ext) { if (ext.hasOwnProperty(k)) { k in base || (base[k] = ext[k]); } } } function Hogehoge() { } fill(Hogehoge.prototype, { prop : 123, method : function() {} }); console.log(new Hogehoge().constructor.name); // -> Hogehoge
見栄えもすっきり〜.