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
2.9k
javascriptにおけるpublicとprivateについて
調べていたら纏めておきたくなったので。
基本的な事がおおいですが。
soplana
August 18, 2012
Tweet
Share
Other Decks in Technology
See All in Technology
DevOps文化を育むQA 〜カルチャーバブルを生み出す戦略〜 / 20250317 Atsushi Funahashi
shift_evolve
1
110
バクラクでのSystem Risk Records導入による変化と改善の取り組み/Changes and Improvement Initiatives Resulting from the Implementation of System Risk Records
taddy_919
0
220
非エンジニアにも伝えるメールセキュリティ / Email security for non-engineers
ykanoh
13
3.9k
チームビルディング「脅威モデリング」ワークショップ
koheiyoshikawa
0
140
Tirez profit de Messenger pour améliorer votre architecture
tucksaun
1
140
Go製のマイグレーションツールの git-schemalex の紹介と運用方法
shinnosuke_kishida
1
410
React Server Componentは 何を解決し何を解決しないのか / What do React Server Components solve, and what do they not solve?
kaminashi
6
1.2k
大規模アジャイル開発のリアル!コミュニケーション×進捗管理×高品質
findy_eventslides
0
530
Compose MultiplatformにおけるiOSネイティブ実装のベストプラクティス
enomotok
1
210
サーバシステムを無理なくコンテナ移行する際に伝えたい4つのポイント/Container_Happy_Migration_Method
ozawa
1
100
ウェブアクセシビリティとは
lycorptech_jp
PRO
0
260
データベースで見る『家族アルバム みてね』の変遷 / The Evolution of Family Album Through the Lens of Databases
kohbis
2
140
Featured
See All Featured
How to train your dragon (web standard)
notwaldorf
91
5.9k
Reflections from 52 weeks, 52 projects
jeffersonlam
349
20k
Faster Mobile Websites
deanohume
306
31k
Unsuck your backbone
ammeep
670
57k
Building Better People: How to give real-time feedback that sticks.
wjessup
367
19k
Building Applications with DynamoDB
mza
94
6.3k
The Cost Of JavaScript in 2023
addyosmani
48
7.6k
Typedesign – Prime Four
hannesfritz
41
2.6k
Practical Orchestrator
shlominoach
187
10k
Product Roadmaps are Hard
iamctodd
PRO
52
11k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
30
1.1k
VelocityConf: Rendering Performance Case Studies
addyosmani
328
24k
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クラスのインスタンス
おしまい!!!!