操作方法

JavaScript Tips and Technique

amachang: seijro@gmail.com

Rediscover JavaScript

10 年。

世界が JavaScript の真の実力を発見するのに要した時間である。

1995 年、Netscape 社の Brendan Eich により開発・設計された JavaScript は、「世界で最も誤解されたプログラミング言語」などと呼ばれもした、

ともすれば不遇とすらいい得る歳月を経て、あたりのそこここに満ち充ちていた「Web の旧来的なインタラクションの窮屈さを革命したい」という思いによって、ふたたび表舞台に招来された。

JavaScript は、Web の「あちら側」と「こちら側」とを取り結ぶ、もっとも古くてもっとも新しい、そして、もっとも重要な技術だ。次の 10 年を自らの手で創り出すために、我々は Shibuya.js を結成した。

JS

今日は

10 年も前に設計され

人々を引きつけ続ける

JavaScript について

お話したいと思います

Agenda

言語としての JavaScript

言語としての JavaScript

初心者向け言語

初心者向け言語

JavaScript は初心者が初めて触るプログラミング言語として最適な言語だと思っています。

どこらへんがそうなのでしょうか。

初心者向け言語に必要なこと

すぐに始められる

すぐに始められることは非常に重要です。

何故なら、すぐに始められないとモチベーションが湧かないからです。

すぐに始められる

JavaScript を開発し始めるために、 必要なものはすべてパソコンを購入した時点で揃っていて、

ブラウザに搭載されているという点は 非常に大きいと思います。

すぐに公開できる

プログラミングが上達する肝は「突っ込まれびりてぃ」です

突っ込みどころ満載なうちに、作ったものを広く公開して 突っ込まれることが大切です

すぐに公開できる

JavaScript は作ったものを「すぐに」公開できます。

そして、「広く」誰でも使うことができます。

すぐに公開できる

ブログサービスによっては、 JavaScript を許可しているところもあるので、 公開するサーバすらなくてもいいのです。

すぐに公開できる

そして、すぐ突っ込まれることができます (・∀・)

すぐにおもしろい

やっぱり、すぐにおもしろいものが作れないと、モチベーションが続かないです。

すぐにおもしろい

すぐにおもしろい

http://hamachiya.com/life_counter/

環境が充実している

JavaScript は開発環境が充実しています。

実際に使われている

indeed.com

様々なことが学べる

JavaScript では、プログラミングに必要な様々なことが学べます

初心者向け言語

このように、 JavaScript はプログラミング学習に最適な言語ということができます。

初心者向け言語

ちなみに、僕は 3 年前まだ初心者だったころに JavaScript に出会い 3 年間。 まだまだ勉強し続けることがたくさんあります。

オブジェクト指向言語

オブジェクト指向言語

JavaScript はオブジェクト指向言語です。

オブジェクト指向言語

オブジェクト指向とは、値(オブジェクト)にメッセージを送って何かの処理をさせたり値を取得したりするという概念です

オブジェクト指向言語

var obj = 'amachang'

obj.length
// 値に length というメッセージを送って
// 値から文字列の長さを得た

obj.substring(3)
// 値に substring と 3 というメッセージを送って
// 3 文字目より後の文字列を得た

オブジェクト指向言語

たいてい、メッセージという概念は 以下のように分けて語られることが多いと思います。

オブジェクト指向言語

JavaScript も同じようにも見えます

しかし、そのように見えているだけで本当は大違いなのです。

オブジェクト指向言語

という訳で今回は JavaScript のメッセージを以下のように分けてみました

オブジェクト指向言語

このように、分けて考えることで JavaScript という言語の見通しが急によくなります。

オブジェクト指向言語

角括弧のメッセージとは値が持っている別の値の参照を取得するためのメッセージです

a = [1, 2, 3]
a [ 1 ] // <- 配列のこれなんかがそう

オブジェクト指向言語

代入演算子の左辺になれば値の追加、または書き換えができます。

a [ 1 ] = 2 // <- 書き換え
a [ 4 ] = 3 // <- 追加

オブジェクト指向言語

また . はこれのシンタックスシュガーです。

obj . hoge = 1
obj . fuga ()

オブジェクト指向言語

また . はこれのシンタックスシュガーです。

obj [ 'hoge' ] = 1
obj [ 'fuga' ] ()

オブジェクト指向言語

丸括弧のメッセージとは、値を関数のように呼び出すためのメッセージです。

f = function(a) { return a + 1};
f ( 1 ) // <- これなんかがそう

オブジェクト指向言語

丸括弧のメッセージは「関数という値」に対してのみ有効なように思えますが、 JavaScript の仕様上はそのような制限ありません。

オブジェクト指向言語

// Firefox では以下は正常に動作する
/^[am]+chang$/ ( 'amachang' )

// IE では alert は関数ではない
typeof alert == 'object'

alert ( 'Hello' )

オブジェクト指向言語

ここで重要なことは JavaScript のは演算子を除くと すべてこのメッセージで できているということです。

(演算子も値だったらな。。)

オブジェクト指向言語

言い換えると、 JavaScript の式は演算子角括弧丸括弧で表されるのです

オブジェクト指向言語

たとえば、

オブジェクト指向言語

// 次の式をすべて角括弧と丸括弧と値で表すと
document.getElementsByTagName('a')[0]
        .appendChild(
            document.createTextNode('リンク')
        )

オブジェクト指向言語

document
  [ 'getElementsByTagName' ]
  ( 'a' )
  [ 0 ]
  [ 'appendChild' ]
  ( document
    [ 'createTextNode' ]
    ( 'リンク' ) )

オブジェクト指向言語

document // <- これは値じゃなくて変数?
  [ 'getElementsByTagName' ]
  ( 'a' )
  [ 0 ]
  [ 'appendChild' ]
  ( document // <- これは値じゃなくて変数?
    [ 'createTextNode' ]
    ( 'リンク' ) )

オブジェクト指向言語

実は、変数参照に見えるそれも概念上はメッセージで表す事ができます

オブジェクト指向言語

誤解を恐れずに言うと、 JavaScript に変数という特別な仕組みは存在しないのです

オブジェクト指向言語

この話を理解する為には with を知る必要があります

オブジェクト指向言語

// with は通常このように使われます

with (document) {
    getElementsByTagName('a')[0]
        .appendChild(createTextNode('リンク'));
}

オブジェクト指向言語

with はブロック(文)内に書かれたシンボルを、ある値への角括弧のメッセージとするための構文なのです。

オブジェクト指向言語

逆に言うと変数を参照するというのは、 with されたに対して角括弧のメッセージを送るということなのです。

オブジェクト指向言語

そして、 JavaScript の関数やグローバル領域は暗黙の with をしていると言えます。

オブジェクト指向言語

// イメージとしては
function(a, b, c) {


    var d = 1;
    var e = d + 1;

}

オブジェクト指向言語

// このような値が暗黙的に with されています
function(a, b, c) {
    with({a:a,b:b,c:c,
            d:undefined,e:undefined}) {
        d = 1;
        e = d + 1;
    }
}

オブジェクト指向言語

このように、 JavaScript では変数すらもメッセージで説明出来てしまうのです。

値とメッセージ。つまり、

オブジェクト指向言語

JavaScript は本質的なオブジェクト指向の仕組み以外のものを ほとんど持っていない非常にシンプルなオブジェクト指向言語と言えるのです。

プロトタイプベース言語

プロトタイプベース言語

JavaScript は、 オブジェクト指向言語を扱いやすくするため、 プロトタイプという仕組みを持っています。

プロトタイプベース言語

プロトタイプとは、ある値(オブジェクト)が(角括弧の)メッセージに対する値を持っていない場合に、代理でメッセージを受け付ける値のことです。

プロトタイプベース言語

f = function() {};
f.prototype = { hoge: 1 }

// new 演算子は f.prototype をプロトタイプとした
// 空のハッシュ {} を作る
a = new f 

a [ 'hoge' ] // これが 1 になる

プロトタイプベース言語

プロトタイプベース言語

f = function() {};
f.prototype = { hoge: 1 }

// new 演算子は f.prototype をプロトタイプとした
// 空のハッシュ {} を作る
a = new f 

a [ 'hoge' ] = 2;
a [ 'hoge' ] // この場合は 2

プロトタイプベース言語

プロトタイプベース言語

// また、包含関係にある変数のスコープも
// プロトタイプで説明することができる

with ({ a: 1 }) {
    with ({ b: 2 }) {
       alert(a); 
       alert(b);
    }
}

プロトタイプベース言語

// また、包含関係にある変数のスコープも
// プロトタイプで説明することができる

with ({ a: 1 }) {      // ←この値が
    with ({ b: 2 }) {  // ←この値のプロトタイプ
       alert(a); // だから、ここで参照することができる
       alert(b);
    }
}

プロトタイプベース言語

プロトタイプを使うと、変数の様な名前空間の包含関係を表現したり、値の共通の性質を一つのオブジェクトに纏めたりすることができます。

関数指向言語

関数指向言語

また JavaScript は関数指向言語だということもできます。

関数指向とは、ラムダ計算を使ってプログラミングをするスタイルです(と僕は思っています)

関数指向言語

JavaScript では、関数はただの値で数値や文字列と比べてもなんの制限もありません。

これが、関数指向のテクニックを使う事を可能にしているのです。

関数指向言語

// たとえば、カリー化

add = function(a, b) { return a + b };

curriedAdd = function(a) { return function(b) {
    return add(a, b);
} };

関数指向言語

// こんな感じで使えます

curriedAdd ( 1 ) ( 3 ) // => 4

add10 = curriedAdd ( 10 )
add10 ( 10 ) // => 20
add10 ( 15 ) // => 35

関数指向言語

// 例えば、遅延評価

force = function(v) {
    return typeof v == 'function'
           && v.length == 0 ? force(v()) : v;
}

関数指向言語

// 遅延評価対応版の add 関数
add = function(a) { return function (b) {
    return function() { return force(a) + force(b) }
} }

force(add (add (1) (3)) (2))                    // => 6
force(add (function() { return 1 + 3 }, 2) // => 6

関数指向言語

JavaScript ではこのように関数指向言語のテクニックを使うこともできるのです。

言語としての JavaScript

これまで、様々な側面からプログラミング言語としての JavaScript を紹介していきました。

言語としての JavaScript

このように、 JavaScript は一粒で四度もおいしいプログラミング言語なんです

言語としての JavaScript

みなさんも、この機会と第一言語、第二言語として JavaScript を使ってみませんか

というわけで

おすすめライブラリ

おすすめライブラリ

これから、 JavaScript を始める人やお気に入りのライブラリがない人のために おすすめのライブラリを紹介します。

おすすめライブラリ

jQuery

jQuery

jQuery は非常に「やわらかい」ライブラリです

現在、日本では一番人気のあるライブラリなのではないでしょうか

jQuery

jQuery の導入方法は簡単で最新版の jquery.js をダウンロードして script タグで読み込むだけです

さっそく使い方を見てみましょう

jQuery

$('ul.foo li')   // CSS のセレクタを指定
    .addClass('bar')
    .addClass('baz')
    .append('chang')

<ul class="foo">
 <li>hoge</li>
 <li>fuga</li>
</ul>

jQuery

$('ul.foo li')
    .addClass('bar')   // したいこと
    .addClass('baz')
    .append('chang')

<ul class="foo">
 <li class="bar">hoge</li>
 <li class="bar">fuga</li>
</ul>

jQuery

$('ul.foo li')
    .addClass('bar')
    .addClass('baz')   // さらにしたいこと
    .append('chang')

<ul class="foo">
 <li class="bar baz">hoge</li>
 <li class="bar baz">fuga</li>
</ul>

jQuery

$('ul.foo li')
    .addClass('bar')
    .addClass('baz')
    .append('chang')   // さらにしたいこと

<ul class="foo">
 <li class="bar baz">hogechang</li>
 <li class="bar baz">fugachang</li>
</ul>

jQuery

jQuery はこのように CSS セレクタメソッドチェーンを使って、 HTML を操作したり HTML が持つ値を取したりするためのライブラリです。

jQuery

jQuery はこのメソッドチェーンに徹底的にこだわっています。

jQuery にしかないの特徴的な例をもう一つお見せします

jQuery

$('ul.foo')   // 要素を選択する
    .addClass('bar')
    .find('> li:first-child')
        .addClass('baz')
    .end()
    .append('<li>piyo</li>')

<ul class="foo">
 <li>hoge</li>
 <li>fuga</li>
</ul>

jQuery

$('ul.foo')
    .addClass('bar')   // class 追加
    .find('> li:first-child')
        .addClass('baz')
    .end()
    .append('<li>piyo</li>')

<ul class="foo bar">
 <li>hoge</li>
 <li>fuga</li>
</ul>

jQuery

$('ul.foo')
    .addClass('bar')
    .find('> li:first-child')   // 現在の要素を起点にして要素を選択
        .addClass('baz')
    .end()
    .append('<li>piyo</li>')

<ul class="foo bar">
 <li>hoge</li>
 <li>fuga</li>
</ul>

jQuery

$('ul.foo')
    .addClass('bar')
    .find('> li:first-child')
        .addClass('baz')   // class 追加
    .end()
    .append('<li>piyo</li>')

<ul class="foo bar">
 <li class="baz">hoge</li>
 <li>fuga</li>
</ul>

jQuery

$('ul.foo')
    .addClass('bar')
    .find('> li:first-child')
        .addClass('baz')
    .end()   // さっきの選択範囲に戻る
    .append('<li>piyo</li>')

<ul class="foo bar">
 <li class="baz">hoge</li>
 <li>fuga</li>
</ul>

jQuery

$('ul.foo')
    .addClass('bar')
    .find('> li:first-child')
        .addClass('baz')
    .end()
    .append('<li>piyo</li>')   // li 要素を追加

<ul class="foo bar">
 <li class="baz">hoge</li>
 <li>fuga</li>
 <li>piyo</li>
</ul>

jQuery

このように、自由に選択範囲を変えながら操作をしていくというのが jQuery のスタイルです。

addClass や append 以外にも便利な関数が沢山あります。

jQuery

逆に、 jQuery にはオブジェクト指向をサポートしたり、配列をリッチにしたりなど、他のライブラリにあるような言語自体を便利にするような機能はついていません

jQuery

jQuery は、 $ 関数とそこから繋ぐメソッドチェーンが全てであり、それだけでほとんどの用件は満たせてしまうのです。

それが jQuery の凄いところです

jQuery

また、多数の jQuery のプラグインも多数開発されていますので、状況に応じて様々な機能を追加できることも jQuery が持つ大きな利点ということができるでしょう。

EXT JS

EXT JS

もう一つ、最近注目しているライブラリが EXT JS です。

このライブラリは jQuery とは対照的に「固い」ライブラリです。

EXT JS

「固い」ライブラリなので、大規模開発でも使うことが出来ると思います。

EXT JS

EXT JS の最大の強みは GUI を作る強力なクラス群です。

とはいえ、 GUI 以外の部分もかなり充実しています。

EXT JS

EXT JS の導入方法はここからを一式をダウンロードして解凍して以下のファイルを読み込みます

EXT JS

// 継承
SubClass = function() { /* コンストラクタの内容 */ };

// ちゃんとプロトタイプを継承する
Ext.extend(SubClass, SuperClass, {
    hoge: function() {
    },
    :
});

EXT JS

// 要素のラッパーを取得 el.dom に実体が入っている
var el = Ext.get('hoge');

var handler = function(e, node) { /* ... */ };

// イベントの割当(名前がかわいい)
el.on('click', handler);
el.un('click', handler);

EXT JS

// CSS のセレクタとメソッドチェーン
Ext.select('div')
    .addClass('foo')
    .addClass('bar')
    .on('click', function() { /* ... */  })
    .applyStyles('background: red')

EXT JS

Klass = function() {
    this.addEvents('hoge', 'fuga', 'piyo' )
    Klass.superclass.constructor.apply(this, arguments)
};

/* Ext.util.Observable を継承する */
Ext.extend(Klass, Ext.util.Observable, {
    method: function(a) { /* ... */ }
});

EXT JS

var obj = new Klass();

obj.beforeMethod('method', function() {})
obj.afterMethod('method', function() {})
obj.on('fuga', function() {})

obj.fireEvent('fuga')
obj.method()

EXT JS

次は、メインの EXT JS の GUI を作る機能を紹介します。

Ext.ComponentMgr.create という関数だけでどんな部品でも自在に作ることができます。

EXT JS

var win = Ext.ComponentMgr.create({
    xtype: 'window', // window を作る
    width: 200, height: 150
});
win.show();

EXT JS

var win = Ext.ComponentMgr.create({
    xtype: 'window', width: 200, height: 150,
    items: [{ xtype: 'tabpanel', ...
        items: [
            { xtype: 'panel', ... },
            { xtype: 'panel', ... }]
    }]
});
win.show();

EXT JS

このように GUI の定義を JSON で書くだけで、かなり簡単に GUI コンポーネントを作ることができます。

EXT JS

また、id:shinichitomitaさんによって作られているAfrousも EXT JS を採用しています。

この作り込みはすごいです。

EXT JS

みなさんも EXT JS を使ってみたら、いかがでしょうか

まとめ

まとめ

一時間ぶっとおしで JavaScript の言語のお話と、 おすすめのライブラリの紹介をいたしました。

まとめ

これで、皆様が少しでも JavaScript に興味を持っていただけたら嬉しいです。

まとめ

ところで

まとめ

今日は IE7 の自動更新の日ですね^^

皆様、家に帰ったら IE7 を入れてみてあげてください^^

まとめ

ではでは

ご清聴ありがとうございました