Google流 JavaScript におけるクラス定義の実現方法
http://www.yunabe.jp/docs/javascript_class_in_google.html
ちょっと便利なJavascriptオブジェクトの作り方
http://blog.asial.co.jp/iphone/1101
ちょっと便利なJavascriptオブジェクトの作り方
今回は、ちょっと便利なJavascriptオブジェクトの作り方をご紹介します。いわゆるモジュール・パターンと呼ばれている方法です。
はじめに
最近、HTML5への注目と共に、Javascriptを使用する機会が増えてきました。以下のように適用範囲は多岐に渡っています。
通常のWebサイトでのユーザビリティ向上
スマートフォン用Webサイト開発
HTML5アプリによるクライアント・アプリ開発
スマートフォンのハイブリッドアプリ開発
Node.jsによるサーバサイド・プログラミング
このように、Javascriptが基幹となる仕組みが広がっています。クライアント側とサーバ側を同じ言語で作れることは、開発側にとってはとても有難いことです(学習コストの低減、人的リソース配分の柔軟性など)。もちろん、発注者やエンドユーアにとっても開発速度などの面で利益が生まれます。
Javascriptプログラミングを行う上で必須なのが、オブジェクトの作り方と活用です。従来、Javascriptといえばグローバル変数や関数を多用したプログラミングがなされていました。しかし今日では、Javascriptの使い方も洗練されてきており、オブジェクトを中心としたコードが一般的です。今後、Javascriptの開発をするには、オブジェクトの作り方・使い方について詳しく知る必要があります。
オブジェクト・リテラル
一番簡単な作り方は、いわゆるオブジェクト・リテラルです。ハッシュ形式でオブジェクトを定義する方法です。
var Person = {
name: 'kazushi',
age : 36,
init: function() {
// 何らかの処理
},
getName: function() {
return this.name;
},
getAge: function() {
return this.age;
},
// オブジェクト内部でしか使わないメソッド
doSomething: function() {
...
}
};
// 初期化を実行
Person.init();
この方法は非常に簡単な反面、全てのプロパティを外部から変更可能です。例えば、
Person.name = 'hoge hoge';
Person.age = 0;
などと、プロパティの値を保障できなくなります。また、doSomething()メソッドを外部から実行できてしまいます。複数人での開発などでは意図しないバグを発せさせかねません。また、影響範囲を明確に定義できない問題があります。そのため、保守性が下がってしまいます。さらに、再利用時には、どのメソッドを使用すべきか迷うことも多々あります。
モジュール・パターン
モジュール・パターンはオブジェクトリテラルより断然お勧めです。プライベートメンバや公開API設定などが容易だからです(リテラルなど通常の作り方の場合、Javascriptではスコープ定義が難しいんですね)。
このパターンでは即時関数を利用します。Javascriptでは即時関数と言って、無名関数をその場で実行する方法があります。例えば、次のように記述します。
(function() {
var i;
for (i=0; i<10; i++) {
// 何らかの処理
}
}());
Javascriptのコードが読み込まれた際に、実行されます。何が便利かというと、変数のスコープを限定し(Javascriptでは変数のスコープが関数単位)、影響範囲を狭めることができます。コードが長くなる際には必須の仕組みです。
この即時関数を利用することで、オブジェクトのプライベートメンバ・メソッドや公開API設定を実施します。
var Person = (function(){
var _name = 'kazushi',
_age = 36;
function _init() {
// 何らかの処理
}
function _getName() {
return _name;
}
function _getAge() {
return _age;
}
function _doSomething() {
...
}
// 初期化を実行する
_init();
// 公開APIを返す
return {
getName: _getName,
getAge : _getAge
};
}());
ポイントは、即時関数内に変数と関数を定義し、最後に公開するものだけをオブジェクトで返している点です。こうすることで、_nameと_ageは外部から変更不可能となります。そして、Personオブジェクトの公開APIを設定でき、設計者の意図通りにこのオブジェクトを制限できます。ここでは_doSomething()関数を外部から実行することはできません。言葉を変えると、使う側は何を使えば良いかをすぐに理解できます。
また、公開APIの変更も簡単です(最後にreturnで返すオブジェクトを変更するだけですね)。
問題点としては、読み込まれた時点でスクリプトが実行される点です。巨大なオブジェクトや複雑な計算を即時関数内に入れて、実行してしまうと時間が掛かります。同時にメモリも消費します。とはいえ、よほどおかしなことをしない限り、実際には大した問題にはなりません。
おわりに
即時関数を用いたJavascriptオブジェクトの作り方は、他にもいろいろとあります。多くのフレームワークでは、即時関数内でオブジェクトを定義し、必要なものだけをwindowオブジェクトのプロパティに追加する方法を使用しています。ちょっとした工夫で、Javascriptをより楽しく便利につかうことは十分可能です。ぜひ試してみて下さい。
コメント
初めまして。
ちょうど最近、JSでのオブジェクト指向開発の方法を調べておりました。
モジュール・パターンはクラスを定義しないため、オブジェクトを即時に生成する方法としては手っ取り早くていいですね。
勉強させて頂きました。ありがとうございます。
ところで、モジュール・パターンのサンプルコードについてですが、
それぞれ最後の行のとじカッコ、正しくは「})();」だと思いますがいかがでしょうか。
by 鈴木健太 | 2012年11月20日 00:03
> 鈴木様
初めまして。
記事がご参考になり幸いです。
ご指摘ありがとうございます。
この部分については、どちらの書き方も使用可能です。
私も実は「})();」の書き方をよく使います。
今回は某書籍にならって「}());」を使ってみました。
by 井川数志 | 2012年11月20日 08:57
ザックリとしたオブジェクトの作り方の説明わかりやすくて参考になります。
>> }());
私もこれを本で見てからはこれを使うようにはしています。(正直、どちらでも問題ないと思います)
この書き方をしている本は私は2冊しかしらないですが。
私の記憶が正しければ、某書籍の某ダグちゃんは、これを使いなさいと、そうすればJS Lintも警告を出さないよ、的なことをおっしゃっていました。
by gatchang | 2012年11月20日 14:14
はじめまして
はてブより来ました。とても参考になる記事を有難うございます。
1つ質問ですが、モジュールパ・ターンで内部の変数名や関数名にアンダーバーを付けているのは
アンダーバー自体で振る舞いが変わるものではなく、「これ、プライベートですよ。外から見えないし使えませんよ」と
見やすくするという意味と思っているのですが当たっていますでしょうか?
by 中島 | 2012年11月20日 14:33
> gatchang様
私も書き方を知ってからは使うようにしています。ただ、慣れないうちは何となく違和感があり、ついつい"})()"を使っていました。
仰る通り、Douglasさんも某Stefanovさんも書籍では "}())" を使っています。"})()"はJSLintだと、「Move
the invocation into the parens that contain the
function.」とか何とか言われてしまいますね。
by 井川数志 | 2012年11月20日 15:54
> 中島様
はじめまして。
アンダーバーを付けている理由は仰る通りです。Javascriptでは変数のスコープが見えづらく苦労するため、可読性を上げるように気を付けています。変数を誤って使ってしまうと、グローバル変数を変えてしまったり、作ってしまったりと、とても恐いので。
個人的には、プライベートメンバとメソッドはアンダーバー開始、ローカル変数は通常の書き方、などとすることが多いです。
by 井川数志 | 2012年11月20日 16:00
prototypeは使わない派ですか?
by yu-yu | 2012年11月20日 20:42
> yu-yu様
もちろん必要に応じて使います(オブジェクトが複数になる場合など)。単一オブジェクトで処理できる場合には、上記の方法を使います。
by 井川数志 | 2012年11月21日 09:33
なるほど、そういうことだったのですね。
井川様、丁寧なお返事ありがとうございます!
by 鈴木健太 | 2012年11月22日 17:16
某書籍とは何でしょうか?
ググっても意味がでてこない・・・こんなことってめずらしい。
by 北村 | 2014年01月29日 10:52
某 書籍のことですね。とある書籍のことですね。。自己解決。すみませんでした。
by 北村 | 2014年01月29日 10:53
2016年2月25日木曜日
なんちゃってデザインパターンで条件分岐をなくす - give IT a try
なんちゃってデザインパターンで条件分岐をなくす - give IT a try
http://blog.jnito.com/entry/20100717/1279321664
http://blog.jnito.com/entry/20100717/1279321664
フリー写真素材
プロカメラマンのフリー写真素材 無料画像素材のプロ・フォト
https://pro.foto.ne.jp/
フリー写真素材 Futta.NET - 無料の風景フリー画像
http://www.futta.net/
https://pro.foto.ne.jp/
フリー写真素材 Futta.NET - 無料の風景フリー画像
http://www.futta.net/
素人がRuby on Railsを勉強してWEBサービスを作るまで | rokuro Fire
素人がRuby on Railsを勉強してWEBサービスを作るまで | rokuro Fire
http://www.rokurofire.info/2013/04/11/rails_webservice/
http://www.rokurofire.info/2013/04/11/rails_webservice/
2016年2月19日金曜日
Wordテンプレート参考: Word VBA ワード文書の書式設定 (パソコン便利ツール集)
Word VBA ワード文書の書式設定 (パソコン便利ツール集)
http://makoto-watanabe.main.jp/WordVba_format.html
http://makoto-watanabe.main.jp/WordVba_format.html
2016年2月17日水曜日
世界の言語の数体系
世界の言語の数体系
http://www.sf.airnet.ne.jp/ts/language/numberj.html
http://www.sf.airnet.ne.jp/ts/language/numberj.html
Numeral Systems of the World's Languages - 世界の数体系に関する大変優れたサイト
Numbers from 1 to 10 in Over 4000 Languages - 4000 個以上の言語での 1 から 10 まで
Numerals in Indo-European Dialects - インド・ヨーロッパ語族の数詞
ヒマラヤの満月と十二進法 - 十二進法の由来
Numbers from 1 to 10 in Over 4000 Languages - 4000 個以上の言語での 1 から 10 まで
Numerals in Indo-European Dialects - インド・ヨーロッパ語族の数詞
ヒマラヤの満月と十二進法 - 十二進法の由来
2016年2月16日火曜日
日本と米国で異なる「想定する物量」がソフトウェア開発の生産性の違いを生む
日本と米国で異なる「想定する物量」がソフトウェア開発の生産性の違いを生む - メソッド屋のブログ
http://simplearchitect.hatenablog.com/entry/2016/02/15/080413
http://simplearchitect.hatenablog.com/entry/2016/02/15/080413
Illustrator CS2で登録画面を表示させない方法
PhotoshopやIllustratorで「登録」ウィンドを表示させない方法
http://ivystar.jp/software/how-you-do-not-want-to-see-wind-register-in-photoshop-and-illustrator/
http://ivystar.jp/software/how-you-do-not-want-to-see-wind-register-in-photoshop-and-illustrator/
2016年2月12日金曜日
2016年2月8日月曜日
Q7 A4イラスト差し替え表
A4イラスト対比表
Q7 A4
RAH-7903 MAM398C
RAH-8338 MAM345C
RAH-8646 MAM309C
B4M-0089 MAM376C
RAH-8646 MAM309C
RAH-8370 MAM310C
RAH-8405 MAM311C
RAH-8406 MAM312C
RAH-8409 MAM313C
B4B-0065 MAM292C
B4M-0105 MAM294C
RAH-8389 MAM318C
RAH-8354 MAM317C
パーキングシステム
RAH-8396 MAM322C
RAH-8410 MAM323C
RAH-8411 MAM324C
RAH-8398 MAM325C
パーキングシステム
RAH-8397 MAM327C
RAH-8399 MAM326C
RAH-8400 MAM328C
RAH-8401 MAM329C
パークアシスト
RAH-0082 MAM297C
RAH-0083 MAM298C
RAH-8392 MAM377C
MMIタッチ
RAH-8357 MAM331C
MMI検索機能_シンボル
RAH-8356 MAM358C
RAH-8339 MAM332C
電話番号のリダイヤル
RAH-7970 MAM335C
RAH-7947 MAM336C
RAH-7902 MAM338C
RAH-8431 MAM337C
RAH-8432 MAM338C
RAH-8569 MAM382C
RAH-8020 RAH-8194
RAH-8360 MAM341C
ナビ_地図
RAH-8121 MAM385C
RAH-8230 MAM384C
ナビ_グーグルアース
RAH-8119 RAH-7971
RAH-8118 RAH-7972
ラジオ
RAH-8340 RAH-8231
RAH-8386 MAM343C
RAH-8229 MAM383C
メディアセンター
RAH-7999 MAM349C
RAH-8000 MAM350C
メディア検索機能
RAH-8337 RAH-8190
TVメニュー
RAH-8126 MAM353C
RAH-8385 RAH-8192
Q7 A4イラスト差し替え表
Q7 A4
RAH-7903 MAM398C
RAH-8338 MAM345C
RAH-8646 MAM309C
B4M-0089 MAM376C
RAH-8646 MAM309C
RAH-8370 MAM310C
RAH-8405 MAM311C
RAH-8406 MAM312C
RAH-8409 MAM313C
B4B-0065 MAM292C
B4M-0105 MAM294C
RAH-8389 MAM318C
RAH-8354 MAM317C
パーキングシステム
RAH-8396 MAM322C
RAH-8410 MAM323C
RAH-8411 MAM324C
RAH-8398 MAM325C
パーキングシステム
RAH-8397 MAM327C
RAH-8399 MAM326C
RAH-8400 MAM328C
RAH-8401 MAM329C
パークアシスト
RAH-0082 MAM297C
RAH-0083 MAM298C
RAH-8392 MAM377C
MMIタッチ
RAH-8357 MAM331C
MMI検索機能_シンボル
RAH-8356 MAM358C
RAH-8339 MAM332C
電話番号のリダイヤル
RAH-7970 MAM335C
RAH-7947 MAM336C
RAH-7902 MAM338C
RAH-8431 MAM337C
RAH-8432 MAM338C
RAH-8569 MAM382C
RAH-8020 RAH-8194
RAH-8360 MAM341C
ナビ_地図
RAH-8121 MAM385C
RAH-8230 MAM384C
ナビ_グーグルアース
RAH-8119 RAH-7971
RAH-8118 RAH-7972
ラジオ
RAH-8340 RAH-8231
RAH-8386 MAM343C
RAH-8229 MAM383C
メディアセンター
RAH-7999 MAM349C
RAH-8000 MAM350C
メディア検索機能
RAH-8337 RAH-8190
TVメニュー
RAH-8126 MAM353C
RAH-8385 RAH-8192
Q7 A4イラスト差し替え表
2016年2月5日金曜日
2016年2月4日木曜日
Excel 「*」「?」を検索するには
ワイルドカード「*」「?」を検索:Excel(エクセル)の使い方-データベース・検索
http://www.relief.jp/itnote/archives/000239.php
~(チルダ)を付けて検索すればよい。
? → ~?
* → ~*
http://www.relief.jp/itnote/archives/000239.php
~(チルダ)を付けて検索すればよい。
? → ~?
* → ~*
2016年2月3日水曜日
Excel 棒グラフ 一部だけ積上げ棒グラフにする
積上げ棒グラフと集合棒グラフの複合グラフについて Excel 2010|おジさん学習帳
http://oji3fromdti.blog.fc2.com/blog-entry-822.html2016年2月2日火曜日
WordPress プラグイン > 記事編集 > TablePress|表・テーブル作成支援
WordPress プラグイン > 記事編集 > TablePress|表・テーブル作成支援
http://wp-themetank.com/wordpress-plugin-tablepress/
http://wp-themetank.com/wordpress-plugin-tablepress/
2016年2月1日月曜日
JavaScript - ServiceWorkerとCache APIを使ってオフラインでも動くWebアプリを作る
JavaScript - ServiceWorkerとCache APIを使ってオフラインでも動くWebアプリを作る - Qiita
http://qiita.com/horo/items/175c8fd7513138308930
http://qiita.com/horo/items/175c8fd7513138308930
登録:
投稿 (Atom)