SlideShare a Scribd company logo
1 of 62
Download to read offline
JSの基本的なことをちょっと
掘り下げてみる話シリーズ
Chapter03. ~ prototype?編 ~
We Are JavaScripters! :)) 3rd
@21cafe
聴衆ターゲット
JSはまだほとんどかいたことがない→×
JSをかいていて、動くんだけど

何でそうなるのかよくわかっていない→○
ライブラリを使うことが多く、

素のJSはよくわからない→△
言語仕様を深く理解している方→×
ベースに

なった本▷
オライリー

開眼!JavaScript

(ふたたび)



すごくいい本です!!
prototype
壮大な話になってしまったので、

2回に分けることにしました

※今回は前提知識の話で、

prototype自体の話はあまりしません
私も完全に理解していない部分

(もしくは理解していると

勘違いしている部分)

がありそうなので、

その際は遠慮なくご指摘くださいmm
INDEX
JSはプロトタイプベースの

オブジェクト指向言語
コンストラクタ関数って?
JSの世界はすべてオブジェクト?
※prototypeの継承まわりを次回に持ち越します!
JavaScriptは
プロトタイプベースの

オブジェクト指向言語

である
引用:MDN

https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Details_of_the_Object_Model
クラスベースとプロトタイプベースの比較
引用:MDN

https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Details_of_the_Object_Model
今日話すところ
あれ?ちょっと待て
ES6にclass構文

ってなかったか?
ES6のclass構文
※”純粋な”プロトタイプベースのオブジェクト指向言語は、JSとは異なるという指摘もある

参考:http://blog.anatoo.jp/entry/2015/05/05/163225
> ECMAScript 6 で導入された JavaScript クラスは、
JavaScript にすでにあるプロトタイプベース継承の糖衣
構文です。クラス構文は、新しいオブジェクト指向継承
モデルを JavaScript に導入しているわけではありません。
引用:MDN(https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Classes)
引用:MDN

https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Details_of_the_Object_Model
引用:MDN

https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Details_of_the_Object_Model
クラスベースにおける「クラス」にあたるものが、

プロトタイプベースにおいては「コンストラクタ関数」

というらしい
コンストラクタ関数っ
て?
9つのネイティブオブジェクトのコンストラクタ
Number()
String()
Boolean()
Object()
Array()
Function()
Date()
RegExp()
Error()
※Math はコンストラクタではなく

 静的オブジェクト
9つのネイティブオブジェクトのコンストラクタ
Number()
String()
Boolean()
Object()
Array()
Function()
Date()
RegExp()
Error()
※Math はコンストラクタではなく

 静的オブジェクト
コンストラクタ関数から

オブジェクトを生成。

結果はarr1,2,3すべて Array[0]

arr2, arr3も内部的に

new Arrayをしている
Arrayをのぞいてみる
コンストラクタ
関数の中身は

[native code]



C or C++

のため

表示不可orz
> you can look at the source repositories for Chromium and Firefox.
(by stack over flow:http://stackoverflow.com/questions/9103336/read-javascript-native-code)
Arrayをのぞいてみる
console.dirで

参照すると、



function

オブジェクト

自体の

プロパティを

参照できる
インスタンス化してみる
インスタンス化してみる
“new” したとき、

一体何が起きてるの?
コンストラクタ関数は、

普通の関数と何が違うの?
コンストラクタ関数の中身

[native code]

↓

よくわからないぞ・・・
自分で

コンストラクタ関数を定義して、

検証してみよう!
自分でコンストラクタ関数を作って検証
自分でコンストラクタ関数を作って検証
自分でコンストラクタ関数を作って検証
自分でコンストラクタ関数を作って検証
returnしてないもんね→
じゃぁ、thisを明示的に返してみたらどうか?
じゃぁ、thisを明示的に返してみたらどうか?
じゃぁ、thisを明示的に返してみたらどうか?
じゃぁ、thisを明示的に返してみたらどうか?
thisの参照先は親オブジェクト
↓newすると・・・
暗黙的に

2つの処理が追加される

らしい!
じゃぁ、objectも生成してやんよ!
※変数名thisだとコンフリクトしてエラーでるので、

objにしています
じゃぁ、objectも生成してやんよ!
じゃぁ、objectも生成してやんよ!
コンストラクタ関数まとめ
普段使っているネイティブオブジェクトは
すべてコンストラクタ関数から生成されて
いる
new演算子を使わなければただの関数
new演算子を使うと、

1.thisにオブジェクト生成&returnを行う

2.prototype継承が行われる(※次回)
JSの世界は

すべてオブジェクト?
この違い、わかりますか?
この違い、わかりますか?
この違い、わかりますか?
いろんな値のtypeof
いろんな値のtypeof
null, undefined, “文字列”,
10, true, false

は

オブジェクトではなく

プリミティブ型
?
なんでできるの?
参考:http://www.m-bsys.com/knowledge/javascript-primitive
> プリミティブ型に対しプロパティの参照や
メソッドの呼び出しがあった場合には、以下
のように一時的・暗黙的にオブジェクト型に
変換されているのです。
ゆえに、new演算子を自分でかくことはほぼない
9つのネイティブオブジェクトのコンストラクタ
Number()
String()
Boolean()
Object()
Array()
Function()
Date()
RegExp()
Error()
※Math はコンストラクタではなく

 静的オブジェクト
じゃぁそもそも、

プリミティブ型と

オブジェクトの違いって・・
そもそも、

プリミティブ型と

オブジェクトの違いって・・
1. 保存・複製の仕方

 参照渡しと値渡し

2. 同値判定の仕方

 参照が同じか、

 値そのものが同じか
JSの世界は

すべてオブジェクト?
NO
プリミティブ値はオブジェクトではない

ただし、nullとundefinedをのぞくプリミティブ値は、
一時的にオブジェクトに変換されオブジェクトのよ
うにふるまう
オブジェクトという言葉において、

JavaScriptオブジェクトとObject()は別物

・Array()オブジェクト

・Object()オブジェクト
まとめ
ここまで、

オブジェクトの生成方法

(コンストラクタ関数)と、

JSに存在するオブジェクトの

全体像のお話をしました
オブジェクトのふるまいを

追っていくと、

prototype が

とても重要な役割を担っ
ていることがわかります
次回こそprototypeの話
ありがとうございました!

More Related Content

Viewers also liked

JSの基本的なことをちょっと掘り下げてみる話シリーズ Chapter02. 〜 デバッグ編 〜
JSの基本的なことをちょっと掘り下げてみる話シリーズ Chapter02. 〜 デバッグ編 〜JSの基本的なことをちょっと掘り下げてみる話シリーズ Chapter02. 〜 デバッグ編 〜
JSの基本的なことをちょっと掘り下げてみる話シリーズ Chapter02. 〜 デバッグ編 〜Yukiko Tamiya
 
Angularfire でのSNS構築
Angularfire でのSNS構築Angularfire でのSNS構築
Angularfire でのSNS構築Yuuta Moriyama
 
Node.jsでDroneたちをめっちゃ簡単にHACKする話 JSオジサン#6
Node.jsでDroneたちをめっちゃ簡単にHACKする話 JSオジサン#6Node.jsでDroneたちをめっちゃ簡単にHACKする話 JSオジサン#6
Node.jsでDroneたちをめっちゃ簡単にHACKする話 JSオジサン#6Yukiko Tamiya
 
Milkcocoa + gmaps.jsで、バーチャルサバゲを作ってみた
Milkcocoa + gmaps.jsで、バーチャルサバゲを作ってみたMilkcocoa + gmaps.jsで、バーチャルサバゲを作ってみた
Milkcocoa + gmaps.jsで、バーチャルサバゲを作ってみたYukiko Tamiya
 
we are javascript LTの資料
we are javascript LTの資料we are javascript LTの資料
we are javascript LTの資料Yuuta Moriyama
 
Introduction to onesocialweb protocol and API
Introduction to onesocialweb protocol and APIIntroduction to onesocialweb protocol and API
Introduction to onesocialweb protocol and APILaurent Eschenauer
 
A short introduction to the cloud
A short introduction to the cloudA short introduction to the cloud
A short introduction to the cloudLaurent Eschenauer
 
Onesocialweb: a platform to build mobile social applications
Onesocialweb: a platform to build mobile social applicationsOnesocialweb: a platform to build mobile social applications
Onesocialweb: a platform to build mobile social applicationsLaurent Eschenauer
 
Drones, Flying robots and Javascript
Drones, Flying robots and JavascriptDrones, Flying robots and Javascript
Drones, Flying robots and JavascriptLaurent Eschenauer
 
node.js and the AR.Drone: building a real-time dashboard using socket.io
node.js and the AR.Drone: building a real-time dashboard using socket.ionode.js and the AR.Drone: building a real-time dashboard using socket.io
node.js and the AR.Drone: building a real-time dashboard using socket.ioSteven Beeckman
 
Digital Security for Journalists
Digital Security for JournalistsDigital Security for Journalists
Digital Security for JournalistsLaurent Eschenauer
 
もう XAMPP / MAMP はいらない!
Vagrant で作る PHP 開発環境
もう XAMPP / MAMP はいらない!
Vagrant で作る PHP 開発環境もう XAMPP / MAMP はいらない!
Vagrant で作る PHP 開発環境
もう XAMPP / MAMP はいらない!
Vagrant で作る PHP 開発環境Masashi Shinbara
 
Digital transformation in other countries' governments
Digital transformation in other countries' governmentsDigital transformation in other countries' governments
Digital transformation in other countries' governmentsSteven Beeckman
 
IoT超初心者がMilkcocoaからラズベリーパイに遠隔Lチカしてみた
IoT超初心者がMilkcocoaからラズベリーパイに遠隔LチカしてみたIoT超初心者がMilkcocoaからラズベリーパイに遠隔Lチカしてみた
IoT超初心者がMilkcocoaからラズベリーパイに遠隔LチカしてみたKayoko Hashi
 
Programación de Drones (Vehículos aéreos no tripulados)
Programación de Drones (Vehículos aéreos no tripulados)Programación de Drones (Vehículos aéreos no tripulados)
Programación de Drones (Vehículos aéreos no tripulados)Carlos Toxtli
 
Advanced programming with #nodecopter
Advanced programming with #nodecopterAdvanced programming with #nodecopter
Advanced programming with #nodecopterLaurent Eschenauer
 
Getting started with ES6 : Future of javascript
Getting started with ES6 : Future of javascriptGetting started with ES6 : Future of javascript
Getting started with ES6 : Future of javascriptMohd Saeed
 

Viewers also liked (20)

JSの基本的なことをちょっと掘り下げてみる話シリーズ Chapter02. 〜 デバッグ編 〜
JSの基本的なことをちょっと掘り下げてみる話シリーズ Chapter02. 〜 デバッグ編 〜JSの基本的なことをちょっと掘り下げてみる話シリーズ Chapter02. 〜 デバッグ編 〜
JSの基本的なことをちょっと掘り下げてみる話シリーズ Chapter02. 〜 デバッグ編 〜
 
Angularfire でのSNS構築
Angularfire でのSNS構築Angularfire でのSNS構築
Angularfire でのSNS構築
 
Node.jsでDroneたちをめっちゃ簡単にHACKする話 JSオジサン#6
Node.jsでDroneたちをめっちゃ簡単にHACKする話 JSオジサン#6Node.jsでDroneたちをめっちゃ簡単にHACKする話 JSオジサン#6
Node.jsでDroneたちをめっちゃ簡単にHACKする話 JSオジサン#6
 
Milkcocoa + gmaps.jsで、バーチャルサバゲを作ってみた
Milkcocoa + gmaps.jsで、バーチャルサバゲを作ってみたMilkcocoa + gmaps.jsで、バーチャルサバゲを作ってみた
Milkcocoa + gmaps.jsで、バーチャルサバゲを作ってみた
 
we are javascript LTの資料
we are javascript LTの資料we are javascript LTの資料
we are javascript LTの資料
 
Introduction to onesocialweb protocol and API
Introduction to onesocialweb protocol and APIIntroduction to onesocialweb protocol and API
Introduction to onesocialweb protocol and API
 
A short introduction to the cloud
A short introduction to the cloudA short introduction to the cloud
A short introduction to the cloud
 
Onesocialweb: a platform to build mobile social applications
Onesocialweb: a platform to build mobile social applicationsOnesocialweb: a platform to build mobile social applications
Onesocialweb: a platform to build mobile social applications
 
Drones, Flying robots and Javascript
Drones, Flying robots and JavascriptDrones, Flying robots and Javascript
Drones, Flying robots and Javascript
 
node.js and the AR.Drone: building a real-time dashboard using socket.io
node.js and the AR.Drone: building a real-time dashboard using socket.ionode.js and the AR.Drone: building a real-time dashboard using socket.io
node.js and the AR.Drone: building a real-time dashboard using socket.io
 
Digital Security for Journalists
Digital Security for JournalistsDigital Security for Journalists
Digital Security for Journalists
 
もう XAMPP / MAMP はいらない!
Vagrant で作る PHP 開発環境
もう XAMPP / MAMP はいらない!
Vagrant で作る PHP 開発環境もう XAMPP / MAMP はいらない!
Vagrant で作る PHP 開発環境
もう XAMPP / MAMP はいらない!
Vagrant で作る PHP 開発環境
 
Digital transformation in other countries' governments
Digital transformation in other countries' governmentsDigital transformation in other countries' governments
Digital transformation in other countries' governments
 
IoT超初心者がMilkcocoaからラズベリーパイに遠隔Lチカしてみた
IoT超初心者がMilkcocoaからラズベリーパイに遠隔LチカしてみたIoT超初心者がMilkcocoaからラズベリーパイに遠隔Lチカしてみた
IoT超初心者がMilkcocoaからラズベリーパイに遠隔Lチカしてみた
 
はじめてのMilkcocoa
はじめてのMilkcocoaはじめてのMilkcocoa
はじめてのMilkcocoa
 
Programación de Drones (Vehículos aéreos no tripulados)
Programación de Drones (Vehículos aéreos no tripulados)Programación de Drones (Vehículos aéreos no tripulados)
Programación de Drones (Vehículos aéreos no tripulados)
 
Advanced programming with #nodecopter
Advanced programming with #nodecopterAdvanced programming with #nodecopter
Advanced programming with #nodecopter
 
jQuery勉強会#4
jQuery勉強会#4jQuery勉強会#4
jQuery勉強会#4
 
Getting started with ES6 : Future of javascript
Getting started with ES6 : Future of javascriptGetting started with ES6 : Future of javascript
Getting started with ES6 : Future of javascript
 
150421 es6とかな話
150421 es6とかな話150421 es6とかな話
150421 es6とかな話
 

Similar to JSの基本的なことをちょっと掘り下げてみる話シリーズ Chapter03. 〜 prototype?編 〜

JSの基本的なことをちょっと掘り下げてみる話シリーズ Chapter04. 〜 prototype編(やっと..!) 〜
JSの基本的なことをちょっと掘り下げてみる話シリーズ Chapter04. 〜 prototype編(やっと..!) 〜JSの基本的なことをちょっと掘り下げてみる話シリーズ Chapter04. 〜 prototype編(やっと..!) 〜
JSの基本的なことをちょっと掘り下げてみる話シリーズ Chapter04. 〜 prototype編(やっと..!) 〜Yukiko Tamiya
 
JavaScriptのパターンの話
JavaScriptのパターンの話JavaScriptのパターンの話
JavaScriptのパターンの話幸子 田宮
 
わかる LT@2
わかる LT@2わかる LT@2
わかる LT@2Shingo Inoue
 
ぼくとしりとりの約3.0*10^3日間戦争
ぼくとしりとりの約3.0*10^3日間戦争ぼくとしりとりの約3.0*10^3日間戦争
ぼくとしりとりの約3.0*10^3日間戦争Eric Sartre
 
eSys01krtt
eSys01krtteSys01krtt
eSys01krttkurotatu
 
オブジェクト指向を 完全に理解していない人が オブジェクト指向を モビルスーツに例えて話してみる
オブジェクト指向を完全に理解していない人がオブジェクト指向をモビルスーツに例えて話してみるオブジェクト指向を完全に理解していない人がオブジェクト指向をモビルスーツに例えて話してみる
オブジェクト指向を 完全に理解していない人が オブジェクト指向を モビルスーツに例えて話してみるpenseestokyo
 
CVPR2017 参加報告 速報版 本会議3日目
CVPR2017 参加報告 速報版 本会議3日目CVPR2017 参加報告 速報版 本会議3日目
CVPR2017 参加報告 速報版 本会議3日目Atsushi Hashimoto
 
春のJavaScript祭り
春のJavaScript祭り春のJavaScript祭り
春のJavaScript祭りMasahiro Hata
 
#2 プログラミングせよ!
#2 プログラミングせよ!#2 プログラミングせよ!
#2 プログラミングせよ!Ryouta Takeuchi
 

Similar to JSの基本的なことをちょっと掘り下げてみる話シリーズ Chapter03. 〜 prototype?編 〜 (9)

JSの基本的なことをちょっと掘り下げてみる話シリーズ Chapter04. 〜 prototype編(やっと..!) 〜
JSの基本的なことをちょっと掘り下げてみる話シリーズ Chapter04. 〜 prototype編(やっと..!) 〜JSの基本的なことをちょっと掘り下げてみる話シリーズ Chapter04. 〜 prototype編(やっと..!) 〜
JSの基本的なことをちょっと掘り下げてみる話シリーズ Chapter04. 〜 prototype編(やっと..!) 〜
 
JavaScriptのパターンの話
JavaScriptのパターンの話JavaScriptのパターンの話
JavaScriptのパターンの話
 
わかる LT@2
わかる LT@2わかる LT@2
わかる LT@2
 
ぼくとしりとりの約3.0*10^3日間戦争
ぼくとしりとりの約3.0*10^3日間戦争ぼくとしりとりの約3.0*10^3日間戦争
ぼくとしりとりの約3.0*10^3日間戦争
 
eSys01krtt
eSys01krtteSys01krtt
eSys01krtt
 
オブジェクト指向を 完全に理解していない人が オブジェクト指向を モビルスーツに例えて話してみる
オブジェクト指向を完全に理解していない人がオブジェクト指向をモビルスーツに例えて話してみるオブジェクト指向を完全に理解していない人がオブジェクト指向をモビルスーツに例えて話してみる
オブジェクト指向を 完全に理解していない人が オブジェクト指向を モビルスーツに例えて話してみる
 
CVPR2017 参加報告 速報版 本会議3日目
CVPR2017 参加報告 速報版 本会議3日目CVPR2017 参加報告 速報版 本会議3日目
CVPR2017 参加報告 速報版 本会議3日目
 
春のJavaScript祭り
春のJavaScript祭り春のJavaScript祭り
春のJavaScript祭り
 
#2 プログラミングせよ!
#2 プログラミングせよ!#2 プログラミングせよ!
#2 プログラミングせよ!
 

JSの基本的なことをちょっと掘り下げてみる話シリーズ Chapter03. 〜 prototype?編 〜