SlideShare une entreprise Scribd logo
1  sur  14
Télécharger pour lire hors ligne
ちょっと詳しくJavaScript 特別編【悪霊の神々】
2011年07月08日




                           株式会社ランチェスター
                           TEL: 03-5775-3395 Fax:03-5775-3396
                           URL: http://www.lanches.co.jp/
名前空間的なもの - 序説
JavaScriptにおける関数定義、変数、クラス的なものなどはすべて何か
のオブジェクトのプロパティとして保持されるため、普通に宣言してしま
うと全てグローバルオブジェクトに属してしまう。
そのため、ライブラリなどで同じ名前があると「後勝ち」してしまい、意図
しない動作を引き起こすことがある。
これを避けるため、グローバルオブジェクトへの定義(汚染)を少なくする
テクニックが生み出された。

それが「名前空間」。

他言語における名前空間、また次世代で検討されているECMAScriptと
しての名前空間とは全く別なので注意してください。



             Proprietary and Confidential to Lanchester Co.,LTD.   Page 1
名前空間的なもの - 実践その1
実はそんなに難しい話じゃないです。

js1.js
function hello() { alert("Hello!"); }

js2.js
function hello() { alert("HELLO!!!"); }

こんなソース2つを読み込むと読み込む順番によってhello関数が上書
きされてしまう。
読み込みの順番を既定したり命名ルールで避ける方法もあるけど、外
部ライブラリを使う場合にはそうも行かないことが・・・



                       Proprietary and Confidential to Lanchester Co.,LTD.   Page 2
名前空間的なもの - 実践その2
js1.js
if(typeof(window.lanchester)=="undefined") {
        window.lanchester = {};
}

window.lanchester.one = {
      hello: function() {
               alert("Hello!");
      }
};

グローバルオブジェクトに変数がすでに存在するかを確認し、ない場合
にはオブジェクトを生成する。
その下に(必要に応じて)ライブラリ名を付け、関数を作成していく。
(js2.jsも同様に)
                       Proprietary and Confidential to Lanchester Co.,LTD.   Page 3
名前空間的なもの - 実践その3
使用する際はそのまま

lanchester.one.hello();
lanchester.two.hello();

となる。

最上位の「lanchester」プロパティのみがグローバルオブジェクトに置か
れ、被害(?)が最小限になる。




                      Proprietary and Confidential to Lanchester Co.,LTD.   Page 4
無名関数作成即実行
関数を作って即実行、その関数は使い捨てたい。
var a = function(){ … };
a();
でもこうするとインスタンスaが出来ちゃう。勿体ない!!

( function(){ … } )();
これで解決!

関数の中で一時変数をたーくさん使ってもグローバルに置かれないので
いろいろ安心できる!

動作的に意味を持たせたいなー・・・なら
( { init: function(){ … } } ).init();
こんなことも!

                     Proprietary and Confidential to Lanchester Co.,LTD.   Page 5
無名関数作成即実行、実例!?
<style type="text/css">
#t { width: 100%; border-collapse:collapse; }
#t td { border: 1px solid #000; }
#t tr.hover { background: #fcc; }
</style>

<table id="t">
             <tr><td>1-1</td><td>1-2</td><td>1-3</td></tr>
             <tr><td>2-1</td><td>2-2</td><td>2-3</td></tr>
             <tr><td>3-1</td><td>3-2</td><td>3-3</td></tr>
</table>

<script type="text/javascript">
for(var i=0, o=document.getElementById("t").getElementsByTagName("tr"), n=o.length; i<n; i++) {
             o[i].addEventListener("mouseover", (function(_tr) {
                          return function() {
                                        _tr.className = "hover";
                          }
             })(o[i]), false);
             o[i].addEventListener("mouseout", (function(_tr) {
                          return function() {
                                        _tr.className = "";
                          }
             })(o[i]), false);
}
</script>
                                     Proprietary and Confidential to Lanchester Co.,LTD.          Page 6
try~catch~finally
try {
         nothingFunction();             // そんな関数はないのに実行
} catch(e) {                            // エラーオブジェクト
         alert(e);                      // nothingFunction is not defined等
} finally {
         …                              // catchされてもされなくても
         …                              // 確実に実行される
}

エラーオブジェクトは各実装で保持しているプロパティが違うのでcatch
した後の扱い方に困る・・・




                      Proprietary and Confidential to Lanchester Co.,LTD.   Page 7
try~catch~finally、実例
var xhr = null;
try {
         xhr = new XMLHttpRequest();
} catch(e) {
         try {
                 xhr = new ActiveXObject("Microsoft.XMLHTTP");
         } catch(e) {
                 try {
                         xhr = new ActiveXObject("Msxml2.XMLHTTP");
                 } catch(e) {
                         alert("Ajax非対応ブラウザ乙ww");
                 }
         }
}

今ではjQueryとかが勝手に作ってくれるAjax用の通信オブジェクト。
昔はこうやって自分で頑張ってつk(ry
                        Proprietary and Confidential to Lanchester Co.,LTD.   Page 8
try~catch~finallyがあるからにはthrowも
function f() {
        throw "can't find";
}

function g() {
        try {
               f();
        } catch(e) {
               alert(e);
        }
}

任意のオブジェクトをthrowすることができる。


                       Proprietary and Confidential to Lanchester Co.,LTD.   Page 9
JavaScriptにおける継承の例 - 定義
function TV(name) {
         this.name = name;
}
TV.prototype.myName = function() { alert(this.name); }
TV.prototype.watch = function() { alert("Watch TV!"); }


function TVwithDVD(name) {
         this.name = name;
}
TVwithDVD.prototype = new TV(); // ここが肝!
TVwithDVD.prototype.play = function() { alert("Play DVD!") }
TVwithDVD.prototype.record = function() { alert("Recording...") }

継承する場合はprototypeへの親クラス代入をコンストラクタ内に書け
ないので注意。
またコンストラクタを継承するのは難易度が高く、実用的ではない。
                          Proprietary and Confidential to Lanchester Co.,LTD.   Page 10
JavaScriptにおける継承の例 - 実践
var tv = new TV("Panazonic");
var dvd = new TVwithDVD("TOSHIVA");

try {
        tv.myName();   // Panazonic
        tv.watch();    // Watch TV!
        tv.play();     // 実行不可
        tv.record();   // 実行不可
} catch(e) {}    // エラー握りつぶし用(本来は非推奨)

try {
        dvd.myName(); // TOSHIVA
        dvd.watch();   // Watch TV!
        dvd.play();    // Play DVD!
        dvd.record();  // Recording...
} catch(e) {}    // エラー握りつぶし用(本来は非推奨)



                       Proprietary and Confidential to Lanchester Co.,LTD.   Page 11
JavaScriptにおける継承の例 - 雑感
JavaScriptにおける継承は、その用途によって多種多様な方法があり
ます。
今回挙げた例はそのうちの一つでしかないので、必要に応じて適した
形を選択する必要があるので、Google等で
「JavaScript 継承」
などで調べることをお奨めします。

クラスベース言語の継承のような機能を提供してくれるライブラリも存
在します。

また、そもそも関連性が希薄なため「継承を使わない」というのも選択
肢の一つに入れておくと良いかもしれません。



            Proprietary and Confidential to Lanchester Co.,LTD.   Page 12
株式会社ランチェスター
TEL: 03-5775-3395 Fax:03-5775-3396
URL: http://www.lanches.co.jp/

Contenu connexe

Tendances

冬のLock free祭り safe
冬のLock free祭り safe冬のLock free祭り safe
冬のLock free祭り safe
Kumazaki Hiroki
 
メディア・アートII 第2回 openFrameworks基礎 配列、くりかえし、乱数 ベクトルを使用したアニメーション
メディア・アートII  第2回 openFrameworks基礎 配列、くりかえし、乱数 ベクトルを使用したアニメーションメディア・アートII  第2回 openFrameworks基礎 配列、くりかえし、乱数 ベクトルを使用したアニメーション
メディア・アートII 第2回 openFrameworks基礎 配列、くりかえし、乱数 ベクトルを使用したアニメーション
Atsushi Tadokoro
 
Scalamacrosについて
ScalamacrosについてScalamacrosについて
Scalamacrosについて
dekosuke
 
Observable Everywhere - Rxの原則とUniRxにみるデータソースの見つけ方
Observable Everywhere  - Rxの原則とUniRxにみるデータソースの見つけ方Observable Everywhere  - Rxの原則とUniRxにみるデータソースの見つけ方
Observable Everywhere - Rxの原則とUniRxにみるデータソースの見つけ方
Yoshifumi Kawai
 

Tendances (20)

非同期処理の基礎
非同期処理の基礎非同期処理の基礎
非同期処理の基礎
 
effective modern c++ chapeter36
effective modern c++ chapeter36effective modern c++ chapeter36
effective modern c++ chapeter36
 
C++ マルチスレッドプログラミング
C++ マルチスレッドプログラミングC++ マルチスレッドプログラミング
C++ マルチスレッドプログラミング
 
TypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめTypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめ
 
C++ マルチスレッド 入門
C++ マルチスレッド 入門C++ マルチスレッド 入門
C++ マルチスレッド 入門
 
Swift 2.0 の Error Handling #yhios
Swift 2.0 の Error Handling #yhiosSwift 2.0 の Error Handling #yhios
Swift 2.0 の Error Handling #yhios
 
C#次世代非同期処理概観 - Task vs Reactive Extensions
C#次世代非同期処理概観 - Task vs Reactive ExtensionsC#次世代非同期処理概観 - Task vs Reactive Extensions
C#次世代非同期処理概観 - Task vs Reactive Extensions
 
BoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうかBoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうか
 
xv6から始めるSPIN入門
xv6から始めるSPIN入門xv6から始めるSPIN入門
xv6から始めるSPIN入門
 
規格書で読むC++11のスレッド
規格書で読むC++11のスレッド規格書で読むC++11のスレッド
規格書で読むC++11のスレッド
 
冬のLock free祭り safe
冬のLock free祭り safe冬のLock free祭り safe
冬のLock free祭り safe
 
メディア・アートII 第2回 openFrameworks基礎 配列、くりかえし、乱数 ベクトルを使用したアニメーション
メディア・アートII  第2回 openFrameworks基礎 配列、くりかえし、乱数 ベクトルを使用したアニメーションメディア・アートII  第2回 openFrameworks基礎 配列、くりかえし、乱数 ベクトルを使用したアニメーション
メディア・アートII 第2回 openFrameworks基礎 配列、くりかえし、乱数 ベクトルを使用したアニメーション
 
async/await のしくみ
async/await のしくみasync/await のしくみ
async/await のしくみ
 
Async design with Unity3D
Async design with Unity3DAsync design with Unity3D
Async design with Unity3D
 
Kanazawa.js.Next
Kanazawa.js.NextKanazawa.js.Next
Kanazawa.js.Next
 
Scalamacrosについて
ScalamacrosについてScalamacrosについて
Scalamacrosについて
 
Shibuya JVM Groovy 20150418
Shibuya JVM Groovy 20150418Shibuya JVM Groovy 20150418
Shibuya JVM Groovy 20150418
 
Go guide for Java programmer
Go guide for Java programmerGo guide for Java programmer
Go guide for Java programmer
 
Observable Everywhere - Rxの原則とUniRxにみるデータソースの見つけ方
Observable Everywhere  - Rxの原則とUniRxにみるデータソースの見つけ方Observable Everywhere  - Rxの原則とUniRxにみるデータソースの見つけ方
Observable Everywhere - Rxの原則とUniRxにみるデータソースの見つけ方
 
Reactive Extensions v2.0
Reactive Extensions v2.0Reactive Extensions v2.0
Reactive Extensions v2.0
 

Similaire à ちょっと詳しくJavaScript 特別編【悪霊の神々】

第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」
yoshiaki iwanaga
 
ちょっと詳しくJavaScript 第2回【関数と引数】
ちょっと詳しくJavaScript 第2回【関数と引数】ちょっと詳しくJavaScript 第2回【関数と引数】
ちょっと詳しくJavaScript 第2回【関数と引数】
株式会社ランチェスター
 
TypeScript 1.0 オーバービュー
TypeScript 1.0 オーバービューTypeScript 1.0 オーバービュー
TypeScript 1.0 オーバービュー
Akira Inoue
 
20090121 J QueryからはじめるJava Script~初級編~
20090121 J QueryからはじめるJava Script~初級編~20090121 J QueryからはじめるJava Script~初級編~
20090121 J QueryからはじめるJava Script~初級編~
Hiromu Shioya
 
おいしいFragment #antama_ws
おいしいFragment #antama_wsおいしいFragment #antama_ws
おいしいFragment #antama_ws
Takahiro Yoshimura
 

Similaire à ちょっと詳しくJavaScript 特別編【悪霊の神々】 (20)

第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」第三回ありえる社内勉強会 「いわががのLombok」
第三回ありえる社内勉強会 「いわががのLombok」
 
Ecmascript2015とその周辺について
Ecmascript2015とその周辺についてEcmascript2015とその周辺について
Ecmascript2015とその周辺について
 
Visual C++で使えるC++11
Visual C++で使えるC++11Visual C++で使えるC++11
Visual C++で使えるC++11
 
ちょっと詳しくJavaScript 第3回【prototype】
ちょっと詳しくJavaScript 第3回【prototype】ちょっと詳しくJavaScript 第3回【prototype】
ちょっと詳しくJavaScript 第3回【prototype】
 
Unit testing JavaScript with JUnit/JavaFX
Unit testing JavaScript with JUnit/JavaFXUnit testing JavaScript with JUnit/JavaFX
Unit testing JavaScript with JUnit/JavaFX
 
GroovyなAndroidテスト #atest_hack
GroovyなAndroidテスト #atest_hackGroovyなAndroidテスト #atest_hack
GroovyなAndroidテスト #atest_hack
 
ちょっと詳しくJavaScript 第2回【関数と引数】
ちょっと詳しくJavaScript 第2回【関数と引数】ちょっと詳しくJavaScript 第2回【関数と引数】
ちょっと詳しくJavaScript 第2回【関数と引数】
 
20141129-dotNet2015
20141129-dotNet201520141129-dotNet2015
20141129-dotNet2015
 
JavaScript入門
JavaScript入門JavaScript入門
JavaScript入門
 
Testman
TestmanTestman
Testman
 
TypeScript 1.0 オーバービュー
TypeScript 1.0 オーバービューTypeScript 1.0 オーバービュー
TypeScript 1.0 オーバービュー
 
JavaのGenericsとは?
JavaのGenericsとは?JavaのGenericsとは?
JavaのGenericsとは?
 
Ajax 応用
Ajax 応用Ajax 応用
Ajax 応用
 
ECMAScript6による関数型プログラミング
ECMAScript6による関数型プログラミングECMAScript6による関数型プログラミング
ECMAScript6による関数型プログラミング
 
Inside frogc in Dart
Inside frogc in DartInside frogc in Dart
Inside frogc in Dart
 
絶対落ちないアプリの作り方
絶対落ちないアプリの作り方絶対落ちないアプリの作り方
絶対落ちないアプリの作り方
 
Scalaで型クラス入門
Scalaで型クラス入門Scalaで型クラス入門
Scalaで型クラス入門
 
20090121 J QueryからはじめるJava Script~初級編~
20090121 J QueryからはじめるJava Script~初級編~20090121 J QueryからはじめるJava Script~初級編~
20090121 J QueryからはじめるJava Script~初級編~
 
おいしいFragment #antama_ws
おいしいFragment #antama_wsおいしいFragment #antama_ws
おいしいFragment #antama_ws
 
Flutterを体験してみませんか
Flutterを体験してみませんかFlutterを体験してみませんか
Flutterを体験してみませんか
 

Plus de 株式会社ランチェスター

Plus de 株式会社ランチェスター (20)

【Web esSense】これぐらいは知っておきたい景表法の基礎知識
【Web esSense】これぐらいは知っておきたい景表法の基礎知識【Web esSense】これぐらいは知っておきたい景表法の基礎知識
【Web esSense】これぐらいは知っておきたい景表法の基礎知識
 
【書籍紹介】未来の働き方を考えよう
【書籍紹介】未来の働き方を考えよう【書籍紹介】未来の働き方を考えよう
【書籍紹介】未来の働き方を考えよう
 
【書籍紹介】型システム入門
【書籍紹介】型システム入門【書籍紹介】型システム入門
【書籍紹介】型システム入門
 
【web esSense】やりなおしのアクセス解析ツール学習~主にGoogle Analytics~
【web esSense】やりなおしのアクセス解析ツール学習~主にGoogle Analytics~【web esSense】やりなおしのアクセス解析ツール学習~主にGoogle Analytics~
【web esSense】やりなおしのアクセス解析ツール学習~主にGoogle Analytics~
 
【らぼ★ろぐ】jPlayerの紹介
【らぼ★ろぐ】jPlayerの紹介【らぼ★ろぐ】jPlayerの紹介
【らぼ★ろぐ】jPlayerの紹介
 
【書籍紹介】統計学が最強の学問である
【書籍紹介】統計学が最強の学問である【書籍紹介】統計学が最強の学問である
【書籍紹介】統計学が最強の学問である
 
【書籍紹介】伝え方が9割
【書籍紹介】伝え方が9割【書籍紹介】伝え方が9割
【書籍紹介】伝え方が9割
 
【らぼ★ろぐ】Web情報セキュリティ入門(OWASPのご紹介)
【らぼ★ろぐ】Web情報セキュリティ入門(OWASPのご紹介)【らぼ★ろぐ】Web情報セキュリティ入門(OWASPのご紹介)
【らぼ★ろぐ】Web情報セキュリティ入門(OWASPのご紹介)
 
【書籍紹介】こころを動かすマーケティング
【書籍紹介】こころを動かすマーケティング【書籍紹介】こころを動かすマーケティング
【書籍紹介】こころを動かすマーケティング
 
【Web es sense】MultipeerConnectivityについて
【Web es sense】MultipeerConnectivityについて【Web es sense】MultipeerConnectivityについて
【Web es sense】MultipeerConnectivityについて
 
【書籍紹介】勝ち続ける意志力
【書籍紹介】勝ち続ける意志力【書籍紹介】勝ち続ける意志力
【書籍紹介】勝ち続ける意志力
 
【書籍紹介】ドメイン駆動設計
【書籍紹介】ドメイン駆動設計【書籍紹介】ドメイン駆動設計
【書籍紹介】ドメイン駆動設計
 
【Web essense】KPIはじめました
【Web essense】KPIはじめました【Web essense】KPIはじめました
【Web essense】KPIはじめました
 
【らぼ★ろぐ】VM上のsendmailから外部へのメールを遮断したい!!
【らぼ★ろぐ】VM上のsendmailから外部へのメールを遮断したい!!【らぼ★ろぐ】VM上のsendmailから外部へのメールを遮断したい!!
【らぼ★ろぐ】VM上のsendmailから外部へのメールを遮断したい!!
 
【書籍紹介】ノンプログラマのためのJavaScript
【書籍紹介】ノンプログラマのためのJavaScript【書籍紹介】ノンプログラマのためのJavaScript
【書籍紹介】ノンプログラマのためのJavaScript
 
【書籍紹介】ゆるす力
【書籍紹介】ゆるす力【書籍紹介】ゆるす力
【書籍紹介】ゆるす力
 
【Web esSense】KPIって何だ??
【Web esSense】KPIって何だ??【Web esSense】KPIって何だ??
【Web esSense】KPIって何だ??
 
【書籍紹介】よくわかるJavaScriptの教科書
【書籍紹介】よくわかるJavaScriptの教科書【書籍紹介】よくわかるJavaScriptの教科書
【書籍紹介】よくわかるJavaScriptの教科書
 
Passbookとは_株式会社ランチェスター
Passbookとは_株式会社ランチェスターPassbookとは_株式会社ランチェスター
Passbookとは_株式会社ランチェスター
 
エンジニア的pinterest考察
エンジニア的pinterest考察エンジニア的pinterest考察
エンジニア的pinterest考察
 

Dernier

Dernier (7)

業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 

ちょっと詳しくJavaScript 特別編【悪霊の神々】