Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
javascriptにおけるpublicとprivateについて
Search
soplana
August 18, 2012
Technology
3k
8
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
javascriptにおけるpublicとprivateについて
調べていたら纏めておきたくなったので。
基本的な事がおおいですが。
soplana
August 18, 2012
Other Decks in Technology
See All in Technology
いちAWSエンジニアのAI活用を振り返る #devio2026 / devio osaka 2026 kawahara
masahirokawahara
2
310
SQL Server 2025 最適化されたロック
odashinsuke
0
120
「とりあえず動く」の先へ。 AI時代のチーム開発と内部設計/2026-slsdays
slsops
0
110
[2026 Oracle Technical Deep Dive] AI時代のデータベース基盤をどう選ぶ? Exadata Database Serviceの選択肢と使い分け (2026年9月17日開催)
oracle4engineer
PRO
0
180
KanaAI
shreyas1009
0
140
カンファレンスに参加した後の浮遊感とセルフケア
pauli
0
300
Snowflake Horizon Catalog と Apache Iceberg で作る オープンなデータ基盤
kitagawaz
0
380
React Nativeでの OTA Updateって、 どう説明する?
ichiki1023
0
130
[2026 Oracle Technical Deep Dive] オンプレミスDBのCloud移行アプローチ:移行計画に基づくメソッドとツールの選択 (2026年9月17日開催)
oracle4engineer
PRO
0
100
TiDBファミリーにDWHが新登場!! TiDB最新情報 / TiDB update 202609
yoshiakiyamasaki
0
190
形式手法を使って仕様をコーディングしよう
mikanichinose
0
160
AIに攻撃される前に、AIに攻撃させる
tsuchikazu
0
110
Featured
See All Featured
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
エンジニアに許された特別な時間の終わり
watany
109
250k
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
1
570
Measuring & Analyzing Core Web Vitals
bluesmoon
9
1k
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
2
930
WENDY [Excerpt]
tessaabrams
14
40k
SEO for Brand Visibility & Recognition
aleyda
0
4.8k
The agentic SEO stack - context over prompts
schlessera
0
950
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
310
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
380
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
brightonSEO & MeasureFest 2025 - Winning Strategies for Black Friday CRO & PPC - Christian Goodrich
cargoodrich
3
860
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クラスのインスタンス
おしまい!!!!