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
ユーザーストーリー x AI / User Stories x AI
oomatomo
0
120
コード1ミリもわからないけど Claude CodeでFigjamプラグインを作った話
abokadotyann
1
150
QAセントラル組織が運営する自動テストプラットフォームの課題と現状
lycorptech_jp
PRO
0
240
ソフトウェアエンジニアとデータエンジニアの違い・キャリアチェンジ
mtpooh
1
730
データ組織ゼロから投資を得るまでの軌跡と未来図 〜AIの前にやるべきこと〜 / Building a Data Organization from Scratch: The Journey to Securing Investment and a Vision for the Future
kaonavi
0
110
AI時代におけるドメイン駆動設計 入門 / Introduction to Domain-Driven Design in the AI Era
fendo181
0
610
バグと向き合い、仕組みで防ぐ
____rina____
0
210
マーケットプレイス版Oracle WebCenter Content For OCI
oracle4engineer
PRO
3
1.3k
技術の総合格闘技!?AIインフラの現在と未来。
ebiken
PRO
0
230
設計は最強のプロンプト - AI時代に武器にすべきスキルとは?-
kenichirokimura
1
330
よくわからない人向けの IAM Identity Center とちょっとした落とし穴
kazzpapa3
2
660
The Twin Mandate of Observability
charity
1
1.2k
Featured
See All Featured
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.6k
Navigating Team Friction
lara
190
15k
Statistics for Hackers
jakevdp
799
220k
Testing 201, or: Great Expectations
jmmastey
46
7.8k
Balancing Empowerment & Direction
lara
5
730
Docker and Python
trallard
46
3.6k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
26
3.2k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
23
1.5k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
658
61k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
9
970
How GitHub (no longer) Works
holman
315
140k
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
2
310
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クラスのインスタンス
おしまい!!!!