Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
javascriptにおけるpublicとprivateについて
Search
soplana
August 18, 2012
Technology
8
3k
javascriptにおけるpublicとprivateについて
調べていたら纏めておきたくなったので。
基本的な事がおおいですが。
soplana
August 18, 2012
Tweet
Share
Other Decks in Technology
See All in Technology
プロダクトエンジニアとしてのマインドセットの育み方 / How to improve product engineer mindset
saka2jp
2
200
ソフトウェアテストのAI活用_ver1.50
fumisuke
0
270
なぜ新機能リリース翌日にモニタリング可能なのか? 〜リードタイム短縮とリソース問題を「自走」で改善した話〜 / data_summit_findy_Session_2
sansan_randd
1
150
Sansan BIが実践する AI on BI とセマンティックレイヤー / data_summit_findy
sansan_randd
0
120
開発者から見たLLMの進化 202511
ny7760
1
160
AIエージェントは「使う」だけじゃなくて「作る」時代! 〜最新フレームワークで楽しく開発入門しよう〜
minorun365
10
1.5k
ソフトウェアエンジニアとデータエンジニアの違い・キャリアチェンジ
mtpooh
1
710
【Android】テキスト選択色の問題修正で心がけたこと
tonionagauzzi
0
110
InsightX 会社説明資料/ Company deck
insightx
0
230
“それなりに”安全なWebアプリケーションの作り方
xryuseix
0
120
Beyond Prompts: Building Intelligent Applications with Genkit and the Model Context Protocol
peterfriese
0
110
バグと向き合い、仕組みで防ぐ
____rina____
0
130
Featured
See All Featured
BBQ
matthewcrist
89
9.9k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
15k
Why Our Code Smells
bkeepers
PRO
340
57k
Agile that works and the tools we love
rasmusluckow
331
21k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
Music & Morning Musume
bryan
46
6.9k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
55
3.1k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
Statistics for Hackers
jakevdp
799
220k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
658
61k
Transcript
Javascriptにおける publicとprivate Twitter : @soplana
1. Javascriptのスコープ 2. thisとは 3. functionの実行 4. functionの引数について 5. クラス宣言とインスタンス
6. publicとprivateを実装する 7. pia.jsを使う【ステマ】
まずは軽くJavascriptのおさらいから。 おさらいする点は以下の5点。 ・スコープ ・this ・メソッド呼び出し ・arguments ・クラス宣言とインスタンス
1. Javascriptのスコープ ・ブロックレベルのスコープは存在しない
1. Javascriptのスコープ ・あるのはfunction毎のスコープのみ
2. thisとは ・基本的には常にグローバルオブジェクトを指す
2. thisとは ・レシーバがあるfunction呼び出しの場合は、レシーバを指す
3. functionの実行 ・極普通に実行 user.getName(); ・function名を文字列で指定して実行 user["getName"](); ・call or applyで実行 user.getName.call();
user.getName.apply(); ・()を使い実行(即時関数パターン) ( user.getName )(); ( function(){return "name"} )(); //即時関数
3. functionの実行 callとapplyについて ・functionを実行させるメソッド ・第一引数にfunction内でのthisが指すオブジェクトを指定することが可能
3. functionの実行 callとapplyについて ・callは、第二引数以降にfunctionに渡すべき引数をカンマ区切りで渡す ・applyは、第二引数にfunctionに渡すべき引数を配列で渡す
・functionの引数チェックはしない 4. functionの引数について
4. functionの引数について argumentsについて ・functionに渡された引数は全てargumentsオブジェクトに格納されている ・Arrayの様に振舞うが、Arrayではない
5. クラス宣言とインスタンス ・他のオブジェクト指向言語のようなクラス宣言のシンタックスは無い ・でも立派なクラスは作れるよ 基本的なクラス宣言の構文 ・User変数に渡しているfunctionがコンストラクタになる ・コンストラクタが与えられたUser変数はnewによりインスタンスを生成出来る
5. クラス宣言とインスタンス その① - インスタンスメソッドの追加 ・インスタンスに追加 問題点 ・インスタンス毎にfunctionを持つので大量にインスタンスを生成するような 処理だとメモリを余計に使ってしまう
5. クラス宣言とインスタンス その② - インスタンスメソッドの追加 ・User.prototypeに追加 ・インスタンス毎にfunctionを持つ問題はprototypeベースでクラスを作成する事 で避ける ・基本的にはprototypeベースで作成していきましょう!
prototypeの特徴についてもう少し ・prototypeが参照されるのは読み取り時のみ ・書き込みはインスタンス毎に新しいpropertyが追加される ・インスタンスからは__proto__でprototypeへの参照が取れる
いよいよ本題のpublic / privateについて話そうか…。
6. publicとprivateを実装する その① - 全部コンストラクタのスコープに実装 ・コンストラクタ内のthisがインスタンスを指すので、全てのメソッドを コンストラクタ内に記述する
解説 ・コンストラクタfunctionのローカルスコープにprivatreメソッドを定義。 ・コンストラクタ内でのthisはインスタンスを指すので、そのthisにメソッドと propertyを宣言する事でpublicメソッドを定義。 ・privateであるupperCaseを呼び出す時はレシーバが存在しない為、 upperCase内でのthisがグローバルオブジェクトを指してしまう。 ・その為、upperCaseを呼び出す際は、callを使い第一引数にUserインスタンス を渡す事でupperCase内のthisもUserインスタンスを指すようにする。 ・prototypeを使ってないのでメモリ食う
その② - privilegedを使う ・privateにもpublicにもアクセス出来る、privilegedを定義する
解説 ・コンストラクタfunctionのローカルスコープにprivatreメソッドを定義。 ・privateメソッドにアクセスするためのprivilegedメソッドを定義。 (今まではコレをpublicだと言っていたけど…。) ・prototypeにpublicメソッドを定義。publicからはprivilegedを介してprivateに アクセスする。 ・しかし、privilegedはインスタンス毎に持つfunctionなので結局メモリは食う。 ・そもそもprivateにアクセスできないpublicの存在意義が怪しい。 ・パッと見で外部に向けて公開されているインターフェイスが分かりやすいと 言う意味では良いかもしれない。
その③ - 即時関数のスコープを使う ・即時関数のローカルスコープにprivateを実装する
解説 ・即時関数のローカルスコープにprivateを実装。 ・publicはprototypeに実装する。publicもprivateも即時関数のスコープ内で定義 するので、publicからprivateも直接参照できる。 ・若干無理矢理感が漂うものの一番マシ(個人的には)。
その④ - publicとprivateを別のオブジェクトで定義
解説 ・public用のclass、private用のclassを用意する ・public用のclassのコンストラクタで、インスタンス変数にprivate用のclassを newして突っ込んでおく ・private用のclassのコンストラタにpublic用のclassのインスタンスを渡して インスタンス変数に突っ込んでおく ・publicメソッドからprivateを参照する場合は、this.private経由で参照する ・privateメソッドからpublicを参照する場合は、this.public経由で参照する ・this.privateをイチイチつけて呼び出すの が面倒すぎる
・publicとprivateを分ける為だけにしては なんだか大げさすぎる感がある
まとめると ・public / privateを実装しようとすると、可読性が下がったり メモリの無駄食いが発生したり、メソッド呼び出しが長ったらしくなったり thisが指すオブジェクトを毎回指定してあげないといけなかったり いまいちどれがベストプラクティスなのか分からない
7. pia.jsを使う【ステマ】 なにそれ ・Javascriptにおけるclass宣言をサポートするライブラリ ・public / privateも簡単に宣言できる ・classメソッド、instanceメソッドの定義もらくちん ・継承もサポート pia.js
- Github Link
pia.js使うとclass宣言がこんな感じ
解説 ・initializeとか.new()でインスタンス生成とかRubyっぽく書ける ・publicというプロパティにネストした形でpublicメソッドを定義していく ・privateというプロパティにネストした形でprivateメソッドを定義していく ・thisが指すのは常にUserクラスのインスタンス
おしまい!!!!