Tuesday, September 01, 2009

閑話:javascriptは読みやすいのか

プログラムのソースコードを読む作業は、はっきり言って地引網を手繰るようなものだとおもう。
ソースコードは漁場で、読む人の能力は地引網だ。

ソースコードなんてものは、作った人が「あー、あーしてこーして」って気ままに書いたメモのようなもんだとおもう。
もちろん、書き方をちゃんと知ってる人が書けば、誰でも読めるものにはなる。
手入れをしっかりした養殖場で地引網を引けば、だれでも獲物を引っ掛けられる。

読む人によっては、網がとっても広いので、たくさんの情報を一気に得られる。
どんな漁場でも、網を操る人がすばらしければ、それなりの勘で獲物を引っ掛けちゃうもの。
でも、普通の人はねぇ。

javascriptのソースコードってのは、なんていうか、膨大な海全体なようです。
どこを狙えばいいのかわかんないよ。
ヒントがないんですよ。

ぐちってもしょうがないな。firefoxのプラグインかなんかに読みやすくしてくれるツールあったりすんのかな?

jQueryプラグイン勉強II

さらにjQueryプラグイン作成の勉強。
というよりJavaScriptの勉強。

JavaScriptは、どんな形のオブジェクトも、宣言なしで作れるようです。
オブジェクト初期化子(Object Initialiser) {} - bnote

JavaScriptには、少し変わった式がある。オブジェクト初期化子を使用することで 指定した名前のプロパティに初期値を持つオブジェクトを返します。

var Class = {
create: function() {
return function() {
this.initialize.apply(this, arguments);
}
}
}

上記例では、{}で囲まれたCreateプロパティの部分が該当します。



「いきなり定義もしていないクラスのインスタンスを作るのか?」
と、C++とJavaを経験してきた私としてはかなりびっくりな初期化ですね。
多くのプラグインの中で多用されています。


なんでこんなことができるのか、はこちらを参照したほうがよさそうです。
JavaScriptは、オブジェクトというものに、とても自由度を持たせているようです。

JavaScript: オブジェクト指向の手法によって高度な Web アプリケーションを作成する
JavaScript オブジェクトはディクショナリである
C++ や C# では、オブジェクトというとクラスや構造体のインスタンスを意味します。オブジェクトにはプロパティやメソッドが含まれていますが、それらはオブジェクト がどのテンプレート (クラス) からインスタンス化されたかによって異なります。このようなことは JavaScript オブジェクトにはありません。JavaScript では、オブジェクトは名前と値のペアの集まりに過ぎません。

jQueryプラグイン

jQueryのプラグイン作成のため、javascriptの勉強中。
なぜプラグインのソースが
(function($){....})(jQuery)
で始まるのかがなぞだった。
下記サイトを参照して解明。

1.無名関数の仮引数に実引数を代入する方法↓
(function(str){alert(str)})("hoge")

2.これを使ってjQueryのプラグインをセキュアに作成する。
jQueryは、$という変数をjQueryのエイリアスとして用いる。

でも$はprototypeでも使用するエイリアス。
だから、混同するのを回避するため、プラグイン内だけでも
"$ = jQueryなんですよ"と明示したい。
そのとき、1.の無名関数が使える。
コードブロック内で$を規定して、混同を回避しちゃうのだ。
jQueryと他のライブラリを同時に使用する方法 [ jQuery ] - StackTrace

また、無名関数の引数に jQuery を渡し、仮引数に $ を使用すれば「(function($) { ... })(jQuery);」、そのコードブロック内で jQuery の $ 関数を使用することが可能です。(そのコードブロック内では、他のライブラリの $ 関数は使用できなくなります。)