JavaScript Programming 2.0 伊藤 直也 [email protected] 株式会社はてな http://www.hatena.ne.jp/ 2005.08.26 ©2005 株式会社はてな 本資料の一部または全部の無断複製・転載を禁じます アジェンダ なぜいま JavaScript? JavaScript で OO 最近熱いJavaScriptな技術 ©2005 株式会社はてな 本資料の一部または全部の無断複製・転載を禁じます なぜいまJavaScript? ユーザーインタフェースプログラミング DHTML Ajax Remix user script (Greasemonkey, Turnabout etc) プラットフォーム(ブラウザ)の進化 Firefox / Safari / Opera / IE 7 JavaScript Programming 再評価 (= 2.0) な2005年 ©2005 株式会社はてな 本資料の一部または全部の無断複製・転載を禁じます JavaScript で OO ©2005 株式会社はてな 本資料の一部または全部の無断複製・転載を禁じます JavaScript で OO JavaScript でも OO できるよ プロトタイプベースなOO言語 いろいろ奥深い Javaとかはクラスベース 関数がオブジェクト モテも非モテも可 手続き型で泥臭く … JavaScript Programming 1.0 OO でかっこよく? … JavaScript Programming 2.0 ©2005 株式会社はてな 本資料の一部または全部の無断複製・転載を禁じます 関数がオブジェクト 関数もオブジェクト。関数がオブジェクトの素 /* コンストラクタ */ function Dog (name) { this.name = name; } var dog = new Dog(‘しなもん’); document.writeln(dog.name); ©2005 株式会社はてな 本資料の一部または全部の無断複製・転載を禁じます メソッド追加はプロパティへの代入 プロパティに関数を代入でメソッド完成 function Dog (name) { this.name = name; this.bark = bark; } function bark () { document.writeln(this.name + ‘: わん’); } var dog = new Dog(‘しなもん’); dog.bark(); ©2005 株式会社はてな 本資料の一部または全部の無断複製・転載を禁じます メソッド追加はプロパティへの代入なので… インスタンスに直接メソッドを追加できる var dog = new Dog(‘しなもん’); dog.bark = function() { ... }; dog.bark(); イベントハンドラへの登録でやってる /* document の onload プロパティに代入 */ document.onload = function () { ... }; ©2005 株式会社はてな 本資料の一部または全部の無断複製・転載を禁じます prototypeオブジェクト その関数をインスタンス化した場合のインスタンス参照 (つまりプロトタイプ) これに色々代入することでオブジェクトを作っていく (プロトタイプベースOO) ので、インスタンスの振る舞いは後から幾らでも拡張/変更できる function Dog (name) { this.name = name; } Dog.prototype.bark = function() { ... }; Dog.prototype.foo = function() { ... }; Dog.prototype.bar = function () { ... }; var dog = new Dog('しなもん'); dog.bark(); dog.foo(); dog.bar(); ©2005 株式会社はてな 本資料の一部または全部の無断複製・転載を禁じます Objectオブジェクト すべてのオブジェクトの祖先 for/in でプロパティをほげる。 連想配列代わりにも使える var object = new Object(); object.jkondo = 'Junya Kondo'; Var hash = new Object(); hash[‘naoya’] = 'Naoya Ito'; hash[‘kawasaki’] = 'Yuichi Kawasaki'; for (var id in hash) { document.write(hash[id]); } ©2005 株式会社はてな 本資料の一部または全部の無断複製・転載を禁じます 継承(っぽいの) // スーパークラス function Human(name) { this.name = name; } // サブクラス function Programmer(name) { this.base = Human; this.base(name); } Programmer.prototype.programming = function () { document.writeln(this.name + ' 「コードを書くよ」'); } // さらに継承 function PerlProgrammer(name) { this.base = Programmer; this.base(name); } // オーバーライドっぽいの PerlProgrammer.prototype.programming = function () { Programmer.prototype.programming.apply(this); // super(); document.writeln(this.name + ': 「#!/usr/local/bin/perl」'); } ©2005 株式会社はてな 本資料の一部または全部の無断複製・転載を禁じます prototype.js で OO Ajax とか Class-Style OO とかの JavaScript フレームワーク http://prototype.conio.net/ クラスベースの方がコードが分かりやすい(か も)。 prototype.js の Class と Object.extend() の出番 ©2005 株式会社はてな 本資料の一部または全部の無断複製・転載を禁じます Class / Object.extend() prototype.js で JavaScript でクラスライクOO // in html <script type=“text/javascript” src=“/path/to/prototype.js”></script> // in js /* class Animal */ var Animal = Class.create(); Animal.prototype = { initialize : function (name) { this.name = name; }, bark : function () { document.writeln(this.name); } } /* class Dog */ var Dog = Class.create(); Dog.prototype = (new Animal).extend({ bark : function() { Animal.prototype.bark.apply(this); } }); ©2005 株式会社はてな 本資料の一部または全部の無断複製・転載を禁じます prototype.jsでデザインパターン やってみてます http://d.hatena.ne.jp/naoya/20050813 結城さん本万歳! / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ | ほう、Abstract Factoryパターンですか? \  ̄ ̄ ̄|/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ∧_∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ( ・∀・) ∧ ∧ < な、なんですか?あなた・・・ ( ⊃ ) (゚Д゚;) \____________  ̄ ̄ ̄ ̄ ̄ (つ_つ____  ̄ ̄ ̄日∇ ̄\|ThinkPad|\  ̄ ========= \ ©2005 株式会社はてな 本資料の一部または全部の無断複製・転載を禁じます 例: Iteratorパターン var Book = Class.create(); Book.prototype = { initialize : function(name) { this.name = name; }, getName : function() { return this.name; } } var BookShelf = Class.create(); BookShelf.prototype = { initialize : function() { this.last = 0; this.books = new Array(); }, getBookAt : function(index) { return this.books[index]; }, appendBook : function(book) { this.books[this.last] = book; this.last++; }, getLength : function() { return this.last; }, iterator : function() { return new BookShelfIterator(this); } } var BookShelfIterator = Class.create(); BookShelfIterator.prototype = { initialize : function(bookshelf) { this.bookshelf = bookshelf; this.index = 0; }, hasNext : function () return this.index < this.bookshelf.getLength(); }, next : function() { return this.bookshelf.getBookAt(this.index++); } } ©2005 株式会社はてな 本資料の一部または全部の無断複製・転載を禁じます 最近熱いJavaScriptな技術 ©2005 株式会社はてな 本資料の一部または全部の無断複製・転載を禁じます Ajax - Asynchronous JavaScript + XML もはやおなじみの動的ロードテクニック XMLHttpRequest で非同期通信 ©2005 株式会社はてな 本資料の一部または全部の無断複製・転載を禁じます Ajax の構成技術 クライアント側 サーバー側 HTML + CSS ブラウザ描写(DHTML) DOM XMLHttpRequest JavaScript ©2005 株式会社はてな 本資料の一部または全部の無断複製・転載を禁じます 非同期通信 サーバーサイド アプリケーション XML API Ajax XMLHttpRequest + DHTML + (XML) var request = new XMLHttpRequest(); request.open("GET", "hello.txt", true); request.onreadystatechange = function() { if (request.readyState == 4) { document.getElementById('message').innerHTML = request.responseText; // or responseXML } DHTML } request.send(null); この手の処理を イベントハンドラに 登録する ©2005 株式会社はてな 本資料の一部または全部の無断複製・転載を禁じます CSI - Client Side Inclusion 外のサイトにある js をクライアントでロード くっつき系。 HTMLにRSS貼ったりとか。 BlogPet とか。 一歩進めて、ライブラリ/実行環境を読み込む手段 として Google AdSense Google Maps API JSON feed <script type=“text/javascript” src=http://example.com/js/foo.js></script> ©2005 株式会社はてな 本資料の一部または全部の無断複製・転載を禁じます Google Maps API CSI なライブラリによるAPI JavaScriptプログラミングでGoogle Maps使えるYO! GXmlHttp で Ajax りつつサーバーサイドアプリケーションと連携 Hatena::Map <html> <head> <!-- CSI で API ライブラリ読み込み --> <script src="http://maps.google.com/maps?file=api&v=1&key=..." type="text/javascript"></script> </head> <body> <!-- Google Maps API が DHTML で描写されるエレメント --> <div id="map" style="width: 500px; height: 400px"></div> <!-- Hack! --> <script type="text/javascript"> var map = new GMap(document.getElementById("map")); map.addControl(new GSmallMapControl()); map.centerAndZoom(new GPoint(139.70486, 35.65497), 2); ... </script> </body> </html> ©2005 株式会社はてな 本資料の一部または全部の無断複製・転載を禁じます JSON – JavaScript Object Notation データ交換フォーマット JavaScriptの記法でオブジェクト、データ構造をシリアライズ Matz日記曰く「YAMLみたいなもの」 PerlのData::Dumper みたいな感じ 変数として受け取るとか eval で受けるとかしてでデシリアライズ starwars.jedi.skywalker[0] = 'anakin'; starwars.jedi.skywalker[1] = 'luke'; var starwars = { jedi : { skywalker : [ 'anakin', 'luke' ] } } ©2005 株式会社はてな 本資料の一部または全部の無断複製・転載を禁じます JSON.pm – Perl to JSON Perlのデータ構造を JSON に変換 Ajaxで使うとベンリ #!/usr/local/bin/perl use strict; use JSON; my $starwars = { jedi => { skywalker => [ 'anakin', 'jedi' ], }, }; { "jedi" : { my $js = JSON->new->objToJson($starwars, { pretty => 1, indent => 2, }); print $js; ©2005 株式会社はてな 本資料の一部または全部の無断複製・転載を禁じます "skywalker" : [ "anakin", "jedi" ] } } XML::Simple + JSON で Ajax 1. 2. 3. 4. 5. 6. [Perl] XML over HTTP な API を叩く [Perl] XML::Simple で parse [Perl] そのまま objToJson で変換 [JavaScript] XMLHttpRequest で結果取得 [JavaScript] JSON を eval [JavaScript] 復元したデータで DHTML DBからデータを読み出してPerlな構造にした後、 JSON に変換 して JavaScript に渡すとか色々応用できる。 ©2005 株式会社はてな 本資料の一部または全部の無断複製・転載を禁じます JSON feed del.icio.us - フィードをJSONで表現 JavaScript + Web で直接 Hack できるように RSS だとサーバーサイドプログラムが必要になりがち CSI で JSON を Include して Hack http://del.icio.us/doc/feeds/json/ <script type="text/javascript" src="http://del.icio.us/feeds/json/lukeskywalker?count=20"></script> <script type="text/javascript"> var ul = document.createElement('ul'); for (var i = 0, post; post = Delicious.posts[i]; i++) { ... document.createElement('a'); a.setAttribute('href', post.u); a.appendChild(document.createTextNode(post.d)); ... } document.getElementById('container').appendChild(ul); ©2005 株式会社はてな 本資料の一部または全部の無断複製・転載を禁じます JKL.ParseXML XMLをJSONに展開するクラス http://www.kawa.net/works/js/jkl/parsexml.html Ajax でのしんどいXML DOMとおさらば <script type="text/javascript" src="jkl-parsexml.js"></script> <script type="text/javascript"> var parser = new JKL.parseXML('http://example.com/starwarsapi'); var starwars = parser.parse(); document.write(starwars.jedi.skywalker[0]); // anakin </script> ©2005 株式会社はてな 本資料の一部または全部の無断複製・転載を禁じます JSAN – JavaScript Archive Network JavaScript版CPAN Perl の JSAN.pm (JSAN shell)でインストール CPANに同じく色々ある prototype.js から切り出されたもの Class Object.extend Function.bind Form.Validator Form.Serializer Wikiwig DOM.Triggers Debug.logger ©2005 株式会社はてな 本資料の一部または全部の無断複製・転載を禁じます JavaScript 開発 & デバッグ http://www.hatena.ne.jp/1123227040 objectdump.js Venkhman ecma-script-mode.el ©2005 株式会社はてな 本資料の一部または全部の無断複製・転載を禁じます ブラウザを Hack する ブラウザを Hack する手段としての JavaScript Bookmarklet user script Greasemonkey, Trixie, Turnabout ... ©2005 株式会社はてな 本資料の一部または全部の無断複製・転載を禁じます まとめ JavaScript を正しく評価しよう Web 1.0 な JavaScript の先入観は捨てよう 悪い例による盲目 JavaScriptでできることを"手段"として身に着け よう サーバーサイドアプリケーションとの連携 ブラウザ Hack、ユーザーインタフェースPG ©2005 株式会社はてな 本資料の一部または全部の無断複製・転載を禁じます
© Copyright 2024 ExpyDoc