読者です 読者をやめる 読者になる 読者になる

関数定義と関数リテラルしたときのコンストラクタ名

■関数定義したコンストラクタ

function A(){}
var a=new A;
console.log(a.__proto__, a instanceof A); // A{}, true

■関数リテラルしたコンストラクタ

var B=function(){};
var b=new B;
console.log(b.__proto__, b instanceof B); // Object{}, true

Bは一見、Bという名のコンストラクタのように見えるが、実際には無名関数の参照に過ぎないということになる。
bのコンストラクタは無名だが、bはBのインスタンスである。という結果はかなり気持ち悪い。

個人的には、後者の関数リテラルで書くほうがjavascript的だなと思うところはあったけど、こうして見るとちょっと問題となりそうにも見える。
コンストラクタ名を比較できないとか?


ここまで書いておいて、同様のことを扱ってる記事がないかと探したら、ありました。
http://qiita.com/items/5df25f771d4602fd6293


それから、以前にprototypeをリテラルで初期化したときのインスタンス
の振る舞いについて書いていた。別の話か
http://ynsyns.hateblo.jp/entry/2012/03/29/203801