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だってプライベートがほしい
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Kaneko Takeshi
August 02, 2019
Technology
59
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
JavaScriptだってプライベートがほしい
Kaneko Takeshi
August 02, 2019
More Decks by Kaneko Takeshi
See All by Kaneko Takeshi
オープンソースライセンスについて勉強する定期
tkckaneko
0
46
Eye Tracking on the Browser
tkckaneko
0
99
IEEE754を完全に理解した
tkckaneko
1
87
CSSのトレンドをみんなで見よう -2021年-
tkckaneko
0
100
多分これが一番早いと思います
tkckaneko
0
31
暗黒面の話
tkckaneko
0
31
CSR / SSR / SSG / JAMstack
tkckaneko
0
79
BOLT
tkckaneko
0
41
CSS Logical Properties and Values
tkckaneko
0
60
Other Decks in Technology
See All in Technology
「守り」で活用するオンデバイスLLM 〜写ってはいけないを総力戦で防ぐ〜 / iOSDC Japan 2026
nakamuuu
0
140
AI時代、データエンジニアが一番おもろい
genshun9
0
500
The Agent Builder Loop from Daily Work to OSS
minorun365
PRO
3
160
Snowflakeのコスト最適化を支えるアーキテクチャ設計
ktatsuya
1
1.5k
range over func 2年間の軌跡 Issue #56413 はGoのエコシステムをどう変えたか
ryujicre8ive
0
150
例外の正しい扱い方 そのエラー try-catchして大丈夫?
jinwatanabe
3
490
2026-09-11 【Snowflake World Tour Tokyo 2026】Snowflakeを起点に、AI Agentが自律稼働し続ける未来へ / Driving AI Agents with Snowflake
civitaspo
0
390
おい、エージェントを使って終わらせろ
nwiizo
0
170
OpenTelemetry eBPF Instrumentationの舞台裏 / Behind the Scenes of OpenTelemetry eBPF Instrumentation
ymotongpoo
4
1.2k
幾何アルゴリズムで なめらかなピン操作を / iOSDC Japan 2026 / smoothpin
kazumanagano
0
330
10分で知る最近のOmarchy
komagata
0
290
Screen Lens - 今見てる画面を翻訳する
komagata
0
280
Featured
See All Featured
Building a Scalable Design System with Sketch
lauravandoore
464
34k
How to build a perfect <img>
jonoalderson
1
6k
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
250
Why You Should Never Use an ORM
jnunemaker
PRO
61
10k
WCS-LA-2024
lcolladotor
0
830
From π to Pie charts
rasagy
0
360
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
69
65k
Speed Design
sergeychernyshev
33
2.1k
Writing Fast Ruby
sferik
630
63k
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.4k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
1
380
Transcript
JavaScriptだってプライベートがほしい
あ・・・ありのまま ES2018の仕様を話すぜ! 「JavaScriptにはPrivate Class Fieldがない」 な・・・ 何を言っているのか わからねーと思うが おれも 何を言ってるのか わからなかった・・・ 頭がどうにかなりそうだった・・・ ReactだとかTypeScriptだとか
そんなチャチなもんじゃあ 断じてねえ もっと恐ろしいものの片鱗を 味わったぜ・・・
そもそもJavaScriptにClassがないじゃん? って思われるかもしれませんが ES2015でクラス構文が定義されました
ただし、オブジェクト指向継承モデルを導入したわけではありません プロトタイプベース継承の糖衣構文です 「特別な関数」という扱いです なので、クラス式という書き方もできます
例) let Rectangle = class { constructor(height, width) { this.height
= height; this.width = width; } calcArea() { return this.height * this.width; } };
初期段階では他の言語では標準である機能については めんどくさかったのか、あと回しになってました(議論はしてた?) なので先程のクラスの変数はすべてpublicです
例) class Engineer { constructer(name, type) { this.name = name;
this.type = type; } speak() { console.log(`${this.name} is ${this.type} Engineer.`) } } const kaneko = new Engineer('Kaneko', 'Front End'); kaneko.speak(); / / Kaneko is Front End Engineer. kaneko.type = 'Unity'; kaneko.speak(); / / Kaneko is Unity Engineer.
None
JavaScriptにもPrivate Class Fieldを 求める声は2017年になってproposalとなりました https:/ /github.com/tc39/proposal-class-fields それまではいろんな手段をつかってきました
例1) 運用でカバー 公開を意図しないフィールドには _ をつけるなど const Engineer = ((name, type)
=> { constructer(name, type) { this._name = name; this._type = type; } speak() { console.log(`${this._name} is ${this._type} Engineer.`) } })
例2)Soft Private const Engineer = ((name, type) => { const
privateName = Symbol() const privateType = Symbol() return class EngineerClass { constructor(name, type) { this[privateName] = name; this[privateType] = type; } speak() { console.log(`${this[privateName]} is ${this[privateType]} Engineer.`) } } })()
ようやくproposalがStage 3になりました! Chrome 74で実装済みです!
例) class Engineer { #name = ''; #type = '';
constructer(name, type) { this.#name = name; this.#type = type; } speak() { console.log(`${this.#name} is ${this.#type} Engneer.`) } } const kaneko = new Engineer('Kaneko', 'Front End'); kaneko.speak(); / / Kaneko is Front End Engineer. kaneko.#type = 'Unity'; / / SyntaxError kaneko.speak(); / / Kaneko is Front End Engineer.
この#を使った構文にたどり着くまでに 紆余曲折がありました 2年もかかりました
JavaScriptでもprivateを使おうとしてたのか 予約語にはなってます しかしJavaScriptでは動的にプロパティが定義できるため 毎回、privateなのかpublicなのか判定する必要が出てきてしまいます
例) class Engineer { private name = '' private type
= '' constructer(name, type) { this.name = name; this.type = type; } } consta kaneko = new Engineer('kaneko', 'Front End'); kaneko.type = 'Unity'; / / public変数として定義される kaneko.speak(); / / Kaneko is Front End Engineer.
#以外の記号も検討されましたが ASI hazardsやshorthandなどを考慮して却下されました
こうしてJavaScriptは2019年になって 念願のプライベートを手に入れるかもしれません (まだStage 3)