2008-05-24
■[JavaScript]constructorとprototype.constructorがわからなくなった
constructor(プロパティ)とprototype.constructor(プロパティ)は
別物だと思っていたけど、やっぱり同じ物だとおもいつつもやっぱり違うのか?と
よくわからなくなってきた。(特に継承とかしようとした場合に)
ので少し調べてみた。
(ちなみにSpiderMonkeyをつかって試している)
constructorプロパティとは
サイ本によると、
とある。
var a = new Array(); a.constructor == Array;//>trueになる
確かに、Arrayオブジェクトでnewした変数aのconstructorプロパティは
Arrayになっているようだ。
じゃあ、Arrayのconstructorプロパティってなんだろ?
これで気になったのは、newしてないArrayオブジェクトのconstructor
プロパティはなんだろう?
それはFunctionオブジェクト。はて?
自作したオブジェクトで考えるとわかりやすいかも
function Hoge(x){ this.x = x; }
と定義する。
HogeのconstructorプロパティもFunctionだ。
これは、書き換えると
var Hoge = new Function("x", "this.x = x");
とも書ける。Arrayオブジェクトのように組み込みオブジェクトは見えないけど
Functionオブジェクトをnewして作られているんだなと考えるとイメージしやすい。
(ただしこの2つは微妙に違いがあるようなのであくまでも考え方です)
続いてprototype.constructorプロパティ
その前にprototypeプロパティとは
関数が定義されたときに自動的に生成される。初期値はconstructor
prototype.constructorプロパティとは
ということで、みてみよう。先ほどのHogeオブジェクトでみてみる
Hoge.prototype.constructor == Hoge; //>true
さあ、こんがらがっていこうか!
ここで問題。
prototype.constructorプロパティはなにか?
なんかHogeっぽくも思える。
でも、
var hoge = new Hoge("hoge"); hoge.prototype.constructor == Hoge;
の結果はhoge.prototypeにそんなプロパティはないよって怒られる。
正解はエラーになる。ですな。
さらに、prototypeプロパティはundefinedになってる。
なーんでか?
先ほどのprototypeプロパティとはで書いた定義をよく見ると、
関数が定義されたときに自動的に生成される。
とある。
変数hogeは関数として定義したわけでないからprototypeプロパティはないわけだ。
見えてきた?2つのconstructorプロパティの関係
ということで、最初のconstructorプロパティと
prototype.constructorプロパティは別か同じかという疑問の答えは
別物とあっさりでてしまった。
そして、不思議なことに、
Hogeオブジェクトとそのオブジェクトから作られたhogeを比較すると、
hoge.constructor == Hoge.prototype.constructor; //>true
と同じものになる。さらに
Hoge.constructor == Function.prototype.constructor; //>true
も同じになる。
newされて生成された変数(インスタンス)のconstructorプロパティは
コンストラクタ関数のprototype.constructorプロパティが設定されてるって
考えられるんだ。
なんだか、脈々と受け継がれている関係がみえてきたような。
- 21 http://www.google.co.jp/search?hl=ja&q=javascript+getelementbyid&lr=
- 9 http://www.google.com/search?hl=ja&lr=lang_ja&ie=UTF-8&oe=UTF-8&q=spins+centos&num=50
- 4 http://search.yahoo.co.jp/search?p=パスカルの三角形とは&search_x=1&tid=top_ga1&ei=UTF-8&qrw=0&pstart=1&fr=top_ga1&b=21
- 4 http://www.google.co.jp/search?hl=ja&client=firefox-a&rls=org.mozilla:ja:official&hs=Y7V&q=scala+generics&btnG=検索&lr=lang_ja
- 4 http://www.google.co.jp/search?hl=ja&lr=lang_ja&client=firefox-a&rls=org.mozilla:ja:official&hs=kR1&q=javascript+getElementById&revid=1644378020&sa=X&oi=revisions_inline&resnum=0&ct=broad-revision&cd=2
- 3 http://www.google.co.jp/reader/view/feed/http://ds.rom-news.org/rss.xml?hl=ja
- 3 http://www.google.co.jp/search?source=ig&hl=ja&rlz=1G1GGLQ_JAJP274&q=javascript+hashmap&meta=lr=lang_ja
- 3 http://www.google.co.jp/search?sourceid=navclient&aq=t&hl=ja&ie=UTF-8&rls=GGLJ,GGLJ:2006-40,GGLJ:ja&q=Fedora8+XP+デュアルブート
- 2 http://blog-search.yahoo.co.jp/search?ei=UTF-8&p=ビューティフルコード&n=10&so=dd&merge=on&tflg=none&sq=M&b=5
- 2 http://cgi.search.biglobe.ne.jp/cgi-bin/search2-b?search=検索&q=パスカルの三角形+プログラム+linux&bt01.x=32&bt01.y=19
