prototype調査

2006年07月25日追記

本項でかなりの部分依存していたEffective JavaScript様が閉鎖されていました。
http://alpha.sourceforge.jp/diary/#d0722
※DS = Dynamic Scriptingのことだと思われます。
非常に悲しくまた個人的にも困っています。Googleキャッシュが残っている内に急いで閲覧しましょう。
http://www.google.co.jp/search?hl=ja&q=site%3Awww.interq.or.jp%2Fstudent%2Fexeal%2Fdss%2Fejs%2F&btnG=Google+%E6%A4%9C%E7%B4%A2&lr=

JavaScriptのプロトタイプについて、の、課題

ECMAScriptJavaScriptの違い

ECMAScriptJavaScriptJScriptの違いを取り除くための、言うならば標準スクリプト
でもなんかJavaScriptベースな気がするので、実質主導権を握っているのはNetScapeサイド(というよりmozillaサイド)の模様。
ただ、ECMAmozillaとのディスカッションにはMicrosoftも出席しているようなので、一方通行というわけではなさそう。詳細は不明。


例によって英語の方のWikiPedia。表ならなんとか私でも理解可能*1
http://en.wikipedia.org/wiki/ECMAScript
現在Web標準で使われている「text/javascript」は、ECMAScript 3rd Editionと思っていてほぼ間違いではない。ブラウザごとに微妙に違いはあるが、ベースはECMAScript 3rd Edition。
蛇足だが「language="JavaScript"」と「type="text/javascript"」と「class="javascript"」等で動作に違いがあるかは不明。


ECMAScript 4th Editionは、JavaScript2.0の仕様策定と同時に策定中の模様。
JavaScript2.0は英語ページに飛ばされたので、根性のある人は読んでみていただければ。
http://www.mozilla.org/js/language/js20/index.html
日本語でも先に紹介したEffective JavaScriptのexeal氏が主導で翻訳中の模様。
http://www.interq.or.jp/student/exeal/dss/mozilla_translation/js20/
ECMAScriptの4thは・・、正直追いかける気力なし。でもこれが標準になればまたWebの制作手法が劇的に変わるだろうな、という感じのことは目次からだけでも伝わってくる。
3rdに関してはMicrosoftもいくつか文献を出しているので、そちらを参照のこと。


ちなみにECMAScriptMIMEは「application/ecmascript」、JavaScriptMIMEは「application/javascript」なので、本当はscriptタグには「application/ecmascript」をtype属性で指定するのが一番よい。
でも実際はブラウザの実装が追いついていない模様なので、text/javascriptが現在では一番いいのだろう。下記サイトが詳しい。
http://www.kanzaki.com/memo/2005/06/28-2

コンストラクタとクラスの関係

Effective JavaScriptを見れば全部載ってる。
いや、疑問点はあるのだが、これは個別に整理して出来れば後日WitchGardenに載せておきたい。

クローンとインスタンスの相違点

これはよくわからなかった。
「クローン」という言葉をJavaScriptでは用いない方が混乱しない気がする。
ので「クローン」はJavaScriptの言葉でないので使わない、というのが個人的な落としどころ*2

constructorプロパティとConstructの関係

new演算子で内部メンバ「Construct」が呼ばれるのはわかったけど、constructorという内部メンバと何か関係あるのかという疑問。
これの回答は「newを使わないでインスタンスを生成出来るかどうか」で調査することにした。Functionオブジェクトは全てConstructメンバを持っていると読めたので、このConstructメンバが参照出来れば出来そうなものだ。

function test(name) {
 this.name = name;
}
var f = new test("f");
f.constructor;    // test関数の中身
f.Construct;      // undefined
f.construct;      // undefined
test.constructor; // Function() { [native code] }
test.Construct;   // undefined
test.construct;   // undefined

うーん、通常手段では無理だろうか。ここでいったん断念。判明したらやはりこれもWitchGardenに載せておく。
おまけ。この時点でconstructorとConstructは別ものだと思うのだがね。

var f2 = new f.constructor("f2");    // testのインスタンス
var f3 = new test.constructor("f3"); // これはFunctionのインスタンスになる。
プロトタイプベースとprototypeプロパティの関係

クローンと同じ。「プロトタイプベース」という言葉の概念はもう混乱するので個人的には排除。
prototypeプロパティの活用方法に限ればEffective JavaScriptに全部載ってる。

まとめ

何気にちょっと面白くなってきているのだが、うんちくバカにならんよう気をつけたい。多分、調もせずにこういう機構を活用したプログラムを書ける人間が、本当のハッカーだと思うのだ。
今回調べている事は所詮知識であり、それ以上でもそれ以下でもない。ただ、私は頭があまり良くないので、こういう事前知識がないと十分な理解が得られないし、組めないから、仕方なく調査をしている。
保留事項をいくつか出してはいるが、調査ばかりやっていても建設的じゃないので次からはprototype.jsの調査に戻ることにする。次はJSONかな。

*1:プログラム組んでいてれば単語はなんとかなるようだ。文章は駄目だが。

*2:仕様書読んでないから本当にこの言葉が使われていないかは未調査。