[javscript]なぜjQuery();と$()は同じなのか。

Posted under javascript by uechoco on 日曜日 30 1月 2011 at 16 : 28 : 51

jQueryの資料を漁っていると、「$はjQueryのエイリアスです」といったことが書かれているのを見かけるんですが、どうして$とjQueryが一緒なのか、ちょっと気になったので調べてみました。

前提知識

ブラウザ環境において、JavaScriptのグローバル変数は、windowオブジェクトの変数と捉えても差支えがないです。例えば以下の例では、alert()文は意図したとおりに3回呼ばれます(HTML上に<script>タグを書いてその中に記述してください)。

JavaScript:
  1. window.a = "a is ok";
  2. var b = "b is ok";
  3. c = "c is ok";
  4. alert(a);
  5. alert(window.b);
  6. alert(window.c);

ブラウザ環境においてはトップレベルオブジェクトはwindowオブジェクトであり、省略することが可能です。「window.a」は省略せずに書いていますが、「var b」はその時点でのローカル変数を定義しています。ただしその時点はwindowオブジェクト下ですので、実質「window.b」と同意義になります。「c」はwindowオブジェクトの指定を省略しただけですので「window.c」と等価です。

jQuery変数と$変数

jQueryのソースコードを見てみます。非圧縮版のソースコードであるjquery-1.4.4.jsを開いてみます。20行目の「var jQuery = (function() {」から910行目の「})();」までがjQueryの定義です。この変数は16行目の「(function( window, undefined ) {」から7179行目の「})(window);」までの関数の中で定義されています。
jQuery変数と$変数の定義は908行目の「return (window.jQuery = window.$ = jQuery);」にあります。window.jQueryすなわちグローバル変数jQueryがwindow.$すなわちグローバル変数$と同一の参照オブジェクトになっています。

※なお、noConflict指定を行った場合は上記と少し違った動きになるかも知れません(使ったことないのでわかりません)

まとめ

結構簡単したね。上記解説は細かいところで"意訳"になっているかも知れませんが、開発中に不都合になるわけでもないと思います。そのうちjQuery読破してみたい^^;


[JavaScript]再入門

Posted under javascript by uechoco on 日曜日 30 1月 2011 at 14 : 00 : 04

昔からHTMLのお供に何気なく使ってきたJavaScriptな訳ですが、最近はjQueryばかり使っていて、JavaScriptの素晴らしさがいまいち分かっていません。いやjQueryであんなことやこんなことがWebページで出来るようなったことはとても素晴らしいのですが、言語自体の素晴らしさがわからないということです。

手元にあった「新人プログラマのためのjQuery Webアプリケーション開発講座」を読んで、入門だけやり直しておきます。下記コードは自分なりに咀嚼して新たに考えたものですので、本の中に載っているものではないです。

制御構文

if-else, switch, while, do-while, for, for-in, try-catch-finally

JavaScript:
  1. // do-while
  2. var c = 0;
  3. do {
  4.     c++;
  5. } while (c <10);
  6.  
  7. // for-in
  8. var total = 0;
  9. var arr = new Array(1,2,3);
  10. for (var i in arr) {
  11.     total += arr[i];
  12. }

配列定義

JavaScript:
  1. // create new array variable
  2. var arr1 = [1,2,3,4]; // create new array which has 4 elements: 1, 2, 3 and 4
  3. var arr2 = new Array(); // create new array which is empty
  4. var arr3 = new Array(5); // create new array which has 5 elements
  5. var arr4 = new Array(1,2); // create new array which has 2 elements: 1 and 2
  6. // create new associative array
  7. var arr5 = {1:"one", 2:"Two", "a": "Three"}; // create new associative array which has 3 elements;

クラスの宣言

JavaScriptではすべてのものがオブジェクトである。JavaScript 1.xには言語上にクラスという概念はないが、他のプログラミング言語でいう"いわゆるクラス"は存在する。
コンストラクタ関数を定義し、それをnewすることでいわゆるクラスが作られる。以降、"いわゆるクラス"をクラスと呼ぶ。

JavaScript:
  1. function Dog(name) {
  2.     this.name = name;
  3.     this.bark = function() {
  4.         return this.name+" barked!";
  5.     }
  6. }
  7. var d1 = new Dog("pochi");
  8. alert(d1.bark());
  9. var d2 = new Dog("taro");
  10. alert(d2.bark());

public/private field/method

クラスにthisで変数や関数を定義するとプロパティ/メソッドとしてクラス外部からアクセス可能な状態となる。
thisではなくvarで変数として定義すると、クラス外部からアクセス不可能な内部プロパティ・内部メソッドとなる。
※関数であれば、普通にfunctionで定義すればよい。

JavaScript:
  1. function Dog(name,age) {
  2.     this.name = name;
  3.     var age = age;
  4.     this.bark = function() {
  5.         return this.name+"("+getNextAge()+") bark!";
  6.     }
  7.     function getNextAge() {
  8.         return age+1;
  9.     }
  10. }
  11. var d1 = new Dog("pochi",5);
  12. alert(d1.bark());
  13. var d2 = new Dog("taro",10);
  14. alert(d2.bark());

クラスの拡張

インスタンスにプロパティやメソッドを追加することは簡単だが、クラス全体にプロパティやメソッドを追加することも簡単である。
前者は何も考えずに新しい変数に代入すればよいが、後者はprototypeプロパティを用いる。

JavaScript:
  1. function Dog(name) {
  2.     this.name = name;
  3.     this.bark = function() {
  4.         return this.name+" bark!";
  5.     }
  6. }
  7. var d1 = new Dog("pochi",5);
  8. alert(d1.bark());
  9. var d2 = new Dog("taro",10);
  10. alert(d2.bark());
  11.  
  12. Dog.prototype.getName = function() {
  13.     return this.name;
  14. }
  15. alert(d1.getName());
  16. alert(d2.getName());

クラスの継承

既存のクラスを継承して新しいクラスを作成することが出来る。

JavaScript:
  1. function Dog(name) {
  2.     this.name = name;
  3.     this.bark = function() {
  4.         return this.name+" bark!";
  5.     }
  6. }
  7. function Bulldog(name) {
  8.     Dog.call(this, name); // thisで実行されているかのようにDogのコンストラクタ関数を呼び出している
  9.     this.bark = function() {
  10.         return this.name+" loudly bark!";
  11.     }
  12. }
  13. var d1 = new Dog("pochi",5);
  14. var d2 = new Bulldog("jiro",5);
  15. alert(d1.bark());
  16. alert(d2.bark());

staticなプロパティ・メソッド

staticなプロパティやメソッド(クラスプロパティやクラスメソッドとも)を作るにはthisではなくクラス名に直接関数を定義する。

JavaScript:
  1. function Dog(name,age) {
  2.     this.name = name;
  3.     this.age = age;
  4.     this.bark = function() {
  5.         return this.name+" bark!";
  6.     }
  7. }
  8. Dog.calcNextAge = function(age) {
  9.     return age+1;
  10. }
  11. var d1 = new Dog("pochi",5);
  12. alert(d1.bark());
  13. alert(Dog.calcNextAge(d1.age));

まとめ

コンストラクタ関数を定義することでクラスを作成したり、クラス自体を後から拡張したりなど、他の言語にはない面白い概念がありますよね。もちろん上にあげたものは"入門"ですので、JavaScriptのマニアックな部分にはまだ触れていないのでしょう。ここからさきのマニアックな部分はどんな面白い概念が出てきますかね!


Copyright © 2012 うえちょこ@ぼろぐ. WP Theme created by Web Top.