SlideShare uma empresa Scribd logo
1 de 63
Baixar para ler offline
Objective
Front-End
JavaScript
自己紹介
me = {
name: "muyuu",
twitter: "@anticyborg",
belongs: "freelance",
job: "Web Front-End Engineer"
};
jQuery plugin
GOOD
• 早い
• 簡単
• 何だったらJS書けなくても何とかなる
BAD
• 変更に弱い
• プラグインにない機能を求められると詰む
• いつまで経ってもJS覚えられない
割と辛い思いをすることも多い
自分で作る
BAD
• 面倒
• 果たして望む機能を作れるのか
• プラグインみたいにすげーの作れるのか
GOOD
• すげーのはいらない。必要な機能だけあれば良い
• 追加機能が欲しくなったらその時足せば良い
• 変更時も理解しやすい(理解しやすいように書けば)
GOOD
• すげーのはいらない。必要な機能だけあれば良い
• 追加機能が欲しくなったらその時足せば良い
• 変更時も理解しやすい(理解しやすいように書けば)
JSの理解も深まるよ!
いいことだらけ
さぁ作ろう
いま作ろう
今回作るもの
Tab
何も考えずにタブを実装
$(function() {
// 最初の要素以外は非表示
$(".body li").not(":first").hide();
$(".tab a").click(function(){
// 表示するコンテンツのIDを取得
var target = $(this).attr("href").replace("#", "");
// コンテンツ部分を全部隠す
$(".body li").hide();
// クリックしたタブのhretと同じIDを持つ箇所だけを表示する
$(".body").find('#' + target).show();
return false;
});
});
problemas
パターンが増える度に
コードが倍増
$(function() {
// アニメーションするパターン
$(".body2 li").not(":first").hide();
$(".tab2 a").click(function(){
var target = $(this).attr("href").replace("#", "");
$(".body2 li").hide('slow');
$(".body2").find('#' + target).show('slow');
return false;
});
// ページ表示時は2つ目が開いてるパターン
$(".body3 li").not(":first").hide();
$(".tab3 a").click(function(){
var target = $(this).attr("href").replace("#", "");
$(".body3 li").hide('slow');
$(".body3").find('#' + target).show('slow');
return false;
});
});
solution
解決法
• タブの原型となるオブジェクトを作る
• 原型を元に実体を生成する
• 実体はパターン毎に生成する
object
オブジェクトとは、名前
と値を持つプロパティを
格納するコンテナにすぎ
ない
— 開眼!JavaScript
object sample
// コンストラクタ関数を使用して僕オブジェクトを生成
var muyuu = new Object();
//僕オブジェクトにプロパティを追加
muyuu.name = "muyuu";
muyuu.age = 33;
muyuu.gender = "male";
console.log(muyuu.age); // 33 と表示される
object sample
//オブジェクトに関数を追加する
muyuu.hello = function(){
console.log("Hello! I'm " + muyuu.name);
};
muyuu.hello();
// "Hello! I'm muyuu" と表示される
• プロパティが関数の場合は「メソッド」とも呼ばれる
コンストラクタ関数?
コンストラクタ関数
コンストラクタ関数とは、あらかじめ決められたオブジェクト
を生成するテンプレート、クッキーの抜き型のようなものだと
思ってください
— 開眼!JavaScript
コンストラクタ関数
var obj = new Object(); // オブジェクトを変数objに生成
var num = new Number(123); // 数値オブジェクトを変数numに生成
var str = new String('aaa'); // 文字列オブジェクトを変数strに生成
コンストラクタ関数
こんな感じのが実装されている
Object = function(){
//新しいオブジェクトを作るための処理
};
コンストラクタ関数で
独自オブジェクトを作る
コンストラクタ関数
僕オブジェクトのテンプレートとして人コンストラクタを作る
var Human = function(name, age, gender){
this.name = name;
this.age = age;
this.gender = gender;
this.hello = function (){
console.log("Hello! I'm " + this.name);
};
};
コンストラクタ関数
人コンストラクタで僕オブジェクトを作成
// Humanコンストラクタを使用して僕オブジェクトを生成
// 生成する際に僕のデータを引数で渡してあげれば
// コンストラクタの設定通りに生成される
var muyuu = new Human("muyuu", 33, "male");
// 挨拶をする
muyuu.hello(); // Hello! I'm muyuu と表示される
ちょっと寄り道して
も1歩深く
通常の関数の挙動
• 関数は通常、何かしらの処理をして何かしらの値を返す
• 何もreturnしない場合はfalse相当の値を返す
//return がある関数
function add(a,b){
return a + b;
}
console.log(add(1, 2)); // 3
// return がない関数
function alertAdd(a, b){
var add = a + b;
}
console.log(alertAdd()); // undefined
コンストラクタ関数の挙動
• オブジェクトを返している
var muyuu = new Human("muyuu", 33, "male");
console.log(muyuu);
// {
// name:"muyuu",
// age:33,
// gender: "male",
// hello: function
// }
Why?
new 演算子
• 関数はnew演算子を使って呼び出された場合、コンストラク
タ関数のthisの値として、生成されたオブジェクトとして設定
する
• new演算子を使って呼び出された場合にreturnを宣言してい
ない場合は通常falseを返すところを新たに生成されるオブジ
ェクト(this)を返すようになる
new 演算子
var Human = function(name, age, gender){
//new演算子で呼び出した場合、実はこの処理が入っている
// var this = new Object();
this.name = name;
this.age = age;
...
//new演算子で呼び出し、returnを行っていない場合
//実はthisを返している
//return this;
};
閑話休題
タブコンストラクタ作って
パターン毎に生成するぜ!
タブの実装に必要な機能
コンストラクタ呼び出し時に以下を指定
• タブのルートのクラス
• タブ部分のクラス
• コンテンツ部分のクラス
タブの実装に必要な機能
必要な機能
*今表示している要素の番号(何番目)
*今表示している要素が何番目かを知る機能
*タブを切り替える機能
*タブ切り替え時にクラスを付与する機能
コンストラクタを作成
// constructor
var Tab = function(param){
};
Tabコンストラクタを作成
コンストラクタ呼び出し時
var tab1 = new Tab({
root: ".tab", // タブのルート要素を指定
item: ".tabHead li", // タブ部分の他所を指定
body: ".tabBody li" // コンテンツ部分の他所を指定
});
コンストラクタ関数呼び出し時に、実際ページあるタブの要素
を新たに作るオブジェクトに設定するため、オプションとして
オブジェクトを渡す。
コンストラクタを作成
var Tab = function(param){
this.$root = $(param.root);
this.$item = this.$root.find(param.item);
this.$body = this.$root.find(param.body);
...
};
コンストラクタ実行時に渡された引数からjQueryオブジェクト
を保存
コンストラクタを作成
var Tab = function(param){
...
//カレントのタブとコンテンツに付与するclassを設定
this.adClass = 'current';
// カレントのコンテンツが何番目かを保存する変数を作成
this.currentIndex;
...
};
コンストラクタを作成
var Tab = function(param){
this.param = param // オプションを追加
...
};
コンストラクタを作成
var Tab = function(param){
...
this.init(); //ページ表示時に実行した処理を実行
//タブをクリックした際の挙動を設定
var self = this; // alias
this.$item.on("click", "a", function(){
self.setCurrent(this); // カレントをセット
self.change(); // タブを切り替え
});
};
コンストラクタを作成
// constructor
var Tab = function(param){
this.param = param;
this.$root = $(param.root);
this.$item = this.$root.find(param.item);
this.$body = this.$root.find(param.body);
this.adClass = 'current'; // class
this.currentIndex = 0; // current tab index
this.init(); // 初期化
var self = this; // alias
this.$item.on("click", "a", function(){ // evnet
self.setCurrent(this);
self.change();
});
};
必要な機能をコンストラクタに追加
ページ表示時に実行する関数
Tab.prototype.init = function(){
this.setCurrent(); // カレントをセット
this.change(); // タブを切り替え
};
必要な機能をコンストラクタに追加
カレントが何番目かを取得する関数
Tab.prototype.setCurrent = function(ele){
this.currentIndex = 0;
if (ele){
// 引数がタブの何番目の要素かを取得
var index = $(ele).parent().index();
// オブジェクト変数にセット
this.currentIndex = index;
}
};
必要な機能をコンストラクタに追加
タブを切り替える関数
Tab.prototype.change = function(){
this.changeTab(); // タブ部分を変更
this.changeBody(); // コンテンツ部分を変更
};
必要な機能をコンストラクタに追加
タブ部分の変更処理をまとめた関数
Tab.prototype.changeTab = function(){
this.$item
.removeClass(this.adClass) // 全部のタブからクラスを外して
.eq(this.currentIndex) // カレントのタブのみ
.addClass(this.adClass); // クラスを付与する
};
必要な機能をコンストラクタに追加
コンテンツ部分の変更処理をまとめた関数
Tab.prototype.changeBody = function(){
this.$body
.removeClass(this.adClass) // 全部のコンテンツからクラスを外して
.hide() // 非表示にして
.eq(this.currentIndex) // カレントのコンテンツのみ
.addClass(this.adClass) // クラスを付与して
.show(); // 表示する
};
完成
後は必要な機能を
必要になったら足すだけ
コンテンツの表示で
アニメーション足したい
該当関数を変更するだけ
Tab.prototype.changeBody = function(){
this.$body
.removeClass(this.adClass) // 全部のコンテンツからクラスを外して
.hide('slow') // 非表示にして
.eq(this.currentIndex) // カレントのコンテンツのみ
.addClass(this.adClass) // クラスを付与して
.show('slow'); // 表示する
};
アニメーションは
オプションにしたい
呼び出し時にオプションを追加
var tab1 = new Tab({
root: ".tab", // タブのルート要素を指定
item: ".tabHead li", // タブ部分の他所を指定
body: ".tabBody li", // コンテンツ部分の他所を指定
duration: true // アニメーションの指定
});
オプションによって挙動を変える
Tab.prototype.changeBody = function(){
this.$body
.removeClass(this.adClass) // 全部のコンテンツからクラスを外して
.hide(param.duration) // 非表示にして
.eq(this.currentIndex) // カレントのコンテンツのみ
.addClass(this.adClass) // クラスを付与して
.show(param.duration); // 表示する
};
呼び出し
var tab1 = new Tab({
root: ".tab", // タブのルート要素を指定
item: ".tabHead li", // タブ部分の他所を指定
body: ".tabBody li", // コンテンツ部分の他所を指定
});
var tab2 = new Tab({
root: ".otherTab", // タブのルート要素を指定
item: ".otherTabHead .tab", // タブ部分の他所を指定
body: ".otherTabBody .content", // コンテンツ部分の他所を指定
duration: 400
});
ステキ

Mais conteúdo relacionado

Destaque

Webクローリング&スクレイピングの最前線 公開用
Webクローリング&スクレイピングの最前線 公開用Webクローリング&スクレイピングの最前線 公開用
Webクローリング&スクレイピングの最前線 公開用
Lumin Hacker
 

Destaque (17)

Js祭り
Js祭りJs祭り
Js祭り
 
Svgアニメーションを実装してみよう 20150207
Svgアニメーションを実装してみよう 20150207Svgアニメーションを実装してみよう 20150207
Svgアニメーションを実装してみよう 20150207
 
BuddyPressで街のポータルサイトを作ろう
BuddyPressで街のポータルサイトを作ろうBuddyPressで街のポータルサイトを作ろう
BuddyPressで街のポータルサイトを作ろう
 
React.jsでHowManyPizza
React.jsでHowManyPizzaReact.jsでHowManyPizza
React.jsでHowManyPizza
 
20141022 リサーチ向け・ブラウザだけでスクレイピング(浅野)
20141022 リサーチ向け・ブラウザだけでスクレイピング(浅野) 20141022 リサーチ向け・ブラウザだけでスクレイピング(浅野)
20141022 リサーチ向け・ブラウザだけでスクレイピング(浅野)
 
第3回Webスクレイピング勉強会@東京 happyou.info
第3回Webスクレイピング勉強会@東京 happyou.info第3回Webスクレイピング勉強会@東京 happyou.info
第3回Webスクレイピング勉強会@東京 happyou.info
 
ソーシャル・スクレイピング(2014年10月Webスクレイピング勉強会資料)
ソーシャル・スクレイピング(2014年10月Webスクレイピング勉強会資料)ソーシャル・スクレイピング(2014年10月Webスクレイピング勉強会資料)
ソーシャル・スクレイピング(2014年10月Webスクレイピング勉強会資料)
 
Scraping withawsAWSを利用してスクレイピングの悩みを解決するチップス
Scraping withawsAWSを利用してスクレイピングの悩みを解決するチップスScraping withawsAWSを利用してスクレイピングの悩みを解決するチップス
Scraping withawsAWSを利用してスクレイピングの悩みを解決するチップス
 
サイト/ブログから本文抽出する方法
サイト/ブログから本文抽出する方法サイト/ブログから本文抽出する方法
サイト/ブログから本文抽出する方法
 
大規模ログ分析におけるAmazon Web Servicesの活用
大規模ログ分析におけるAmazon Web Servicesの活用大規模ログ分析におけるAmazon Web Servicesの活用
大規模ログ分析におけるAmazon Web Servicesの活用
 
Webクローリング&スクレイピングの最前線 公開用
Webクローリング&スクレイピングの最前線 公開用Webクローリング&スクレイピングの最前線 公開用
Webクローリング&スクレイピングの最前線 公開用
 
オープンデータ・パーソナルデータビジネス最前線
オープンデータ・パーソナルデータビジネス最前線オープンデータ・パーソナルデータビジネス最前線
オープンデータ・パーソナルデータビジネス最前線
 
クローリングしにくいものに挑戦 公開用
クローリングしにくいものに挑戦 公開用クローリングしにくいものに挑戦 公開用
クローリングしにくいものに挑戦 公開用
 
WordCamp Tokyo2016itkaasan
WordCamp Tokyo2016itkaasanWordCamp Tokyo2016itkaasan
WordCamp Tokyo2016itkaasan
 
オープニングトーク - 創設の思い・目的・進行方針  -データマイニング+WEB勉強会@東京
オープニングトーク - 創設の思い・目的・進行方針  -データマイニング+WEB勉強会@東京オープニングトーク - 創設の思い・目的・進行方針  -データマイニング+WEB勉強会@東京
オープニングトーク - 創設の思い・目的・進行方針  -データマイニング+WEB勉強会@東京
 
クラウドネイティブなアーキテクチャでサクサク解析
クラウドネイティブなアーキテクチャでサクサク解析クラウドネイティブなアーキテクチャでサクサク解析
クラウドネイティブなアーキテクチャでサクサク解析
 
実践Excelスクレイピング
実践Excelスクレイピング実践Excelスクレイピング
実践Excelスクレイピング
 

Semelhante a Objective Front-End JavaScript

WordBench Kobe jQueryどうでしょう
WordBench Kobe jQueryどうでしょうWordBench Kobe jQueryどうでしょう
WordBench Kobe jQueryどうでしょう
Hishikawa Takuro
 
プロパティディスクリプタとその拡張ライブラリ
プロパティディスクリプタとその拡張ライブラリプロパティディスクリプタとその拡張ライブラリ
プロパティディスクリプタとその拡張ライブラリ
Yusuke Muraoka
 

Semelhante a Objective Front-End JavaScript (19)

Javascripでオブジェクト指向
Javascripでオブジェクト指向Javascripでオブジェクト指向
Javascripでオブジェクト指向
 
Knockout.js を利用したインタラクティブ web アプリケーション開発
Knockout.js を利用したインタラクティブ web アプリケーション開発Knockout.js を利用したインタラクティブ web アプリケーション開発
Knockout.js を利用したインタラクティブ web アプリケーション開発
 
Jetpack Workshop
Jetpack WorkshopJetpack Workshop
Jetpack Workshop
 
View customize pluginを使いこなす
View customize pluginを使いこなすView customize pluginを使いこなす
View customize pluginを使いこなす
 
Dotnetconf2017
Dotnetconf2017Dotnetconf2017
Dotnetconf2017
 
第4回REST勉強会 RequireJS編
第4回REST勉強会 RequireJS編第4回REST勉強会 RequireJS編
第4回REST勉強会 RequireJS編
 
BluemixでGWTアプリケーションを動かす(2)
BluemixでGWTアプリケーションを動かす(2)BluemixでGWTアプリケーションを動かす(2)
BluemixでGWTアプリケーションを動かす(2)
 
Couch Db勉強会0623 by yssk22
Couch Db勉強会0623 by yssk22Couch Db勉強会0623 by yssk22
Couch Db勉強会0623 by yssk22
 
ScaLa+Liftとか
ScaLa+LiftとかScaLa+Liftとか
ScaLa+Liftとか
 
お手軽Ajaxアプリケーションの作り方
お手軽Ajaxアプリケーションの作り方お手軽Ajaxアプリケーションの作り方
お手軽Ajaxアプリケーションの作り方
 
Jetpack Library 事始め
Jetpack Library 事始めJetpack Library 事始め
Jetpack Library 事始め
 
WordBench Kobe jQueryどうでしょう
WordBench Kobe jQueryどうでしょうWordBench Kobe jQueryどうでしょう
WordBench Kobe jQueryどうでしょう
 
"あんざいゆき" x "秋葉ちひろ" はカンファレンスアプリをどう作るのか?
"あんざいゆき" x "秋葉ちひろ" はカンファレンスアプリをどう作るのか?"あんざいゆき" x "秋葉ちひろ" はカンファレンスアプリをどう作るのか?
"あんざいゆき" x "秋葉ちひろ" はカンファレンスアプリをどう作るのか?
 
Flash Builder4 と FlashCatalyst を使ってみた
Flash Builder4 と FlashCatalyst を使ってみたFlash Builder4 と FlashCatalyst を使ってみた
Flash Builder4 と FlashCatalyst を使ってみた
 
ECMAScript6による関数型プログラミング
ECMAScript6による関数型プログラミングECMAScript6による関数型プログラミング
ECMAScript6による関数型プログラミング
 
脱・独自改造! GebでWebDriverをもっとシンプルに
脱・独自改造! GebでWebDriverをもっとシンプルに脱・独自改造! GebでWebDriverをもっとシンプルに
脱・独自改造! GebでWebDriverをもっとシンプルに
 
JavaScript入門
JavaScript入門JavaScript入門
JavaScript入門
 
Azure Functions 入門
Azure Functions 入門Azure Functions 入門
Azure Functions 入門
 
プロパティディスクリプタとその拡張ライブラリ
プロパティディスクリプタとその拡張ライブラリプロパティディスクリプタとその拡張ライブラリ
プロパティディスクリプタとその拡張ライブラリ
 

Mais de Muyuu Fujita

あの時AngularJSと出会った僕らは
あの時AngularJSと出会った僕らはあの時AngularJSと出会った僕らは
あの時AngularJSと出会った僕らは
Muyuu Fujita
 
Cssアニメーションとその制御
Cssアニメーションとその制御Cssアニメーションとその制御
Cssアニメーションとその制御
Muyuu Fujita
 
Html5でword pressテーマを作るよ!
Html5でword pressテーマを作るよ!Html5でword pressテーマを作るよ!
Html5でword pressテーマを作るよ!
Muyuu Fujita
 

Mais de Muyuu Fujita (14)

Hello npm
Hello npmHello npm
Hello npm
 
Learn ES2015
Learn ES2015Learn ES2015
Learn ES2015
 
Start React with Browserify
Start React with BrowserifyStart React with Browserify
Start React with Browserify
 
小規模案件で作られた秘伝のタレ
小規模案件で作られた秘伝のタレ小規模案件で作られた秘伝のタレ
小規模案件で作られた秘伝のタレ
 
閉じタグを超えた先に僕が見た景色とは
閉じタグを超えた先に僕が見た景色とは閉じタグを超えた先に僕が見た景色とは
閉じタグを超えた先に僕が見た景色とは
 
JavaScriptと共に歩いて行く決意をした君へ
JavaScriptと共に歩いて行く決意をした君へJavaScriptと共に歩いて行く決意をした君へ
JavaScriptと共に歩いて行く決意をした君へ
 
非ガチ勢「よし、Coffee script使おう!」
非ガチ勢「よし、Coffee script使おう!」非ガチ勢「よし、Coffee script使おう!」
非ガチ勢「よし、Coffee script使おう!」
 
あの時AngularJSと出会った僕らは
あの時AngularJSと出会った僕らはあの時AngularJSと出会った僕らは
あの時AngularJSと出会った僕らは
 
デザイナー向け 初めてのPhp ~サイト制作に役立つtips~
デザイナー向け 初めてのPhp ~サイト制作に役立つtips~デザイナー向け 初めてのPhp ~サイト制作に役立つtips~
デザイナー向け 初めてのPhp ~サイト制作に役立つtips~
 
Cssアニメーションとその制御
Cssアニメーションとその制御Cssアニメーションとその制御
Cssアニメーションとその制御
 
WordPressで企業サイトのテーマを作る
WordPressで企業サイトのテーマを作るWordPressで企業サイトのテーマを作る
WordPressで企業サイトのテーマを作る
 
WPerのWPerによるWPerのためのPHP入門
WPerのWPerによるWPerのためのPHP入門WPerのWPerによるWPerのためのPHP入門
WPerのWPerによるWPerのためのPHP入門
 
ノンプログラマのGit入門
ノンプログラマのGit入門ノンプログラマのGit入門
ノンプログラマのGit入門
 
Html5でword pressテーマを作るよ!
Html5でword pressテーマを作るよ!Html5でword pressテーマを作るよ!
Html5でword pressテーマを作るよ!
 

Último

Último (7)

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

Objective Front-End JavaScript