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だってプライベートがほしい
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Kaneko Takeshi
August 02, 2019
Technology
54
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
44
Eye Tracking on the Browser
tkckaneko
0
99
IEEE754を完全に理解した
tkckaneko
1
85
CSSのトレンドをみんなで見よう -2021年-
tkckaneko
0
100
多分これが一番早いと思います
tkckaneko
0
31
暗黒面の話
tkckaneko
0
31
CSR / SSR / SSG / JAMstack
tkckaneko
0
79
BOLT
tkckaneko
0
40
CSS Logical Properties and Values
tkckaneko
0
55
Other Decks in Technology
See All in Technology
Forza Horizon 6 のテレメトリ機能で 自動運転に使えそうな学習データを集める話
henjin0
0
130
AI時代の強いチームの作り方
yuukiyo
24
15k
AIが自社のTableauを操作する世界へ:Tableau MCP超入門
tbtykk
0
110
ガバメントクラウドでのランサムウェア対策
techniczna
1
790
AI駆動開発は個人技からチーム戦へ:組織でAIを使いこなすための実践設計
moongift
PRO
0
450
サイバー捜査員研修(後半)
nomizone
1
680
【CEDEC2026】『Relink』を拡張せよ - 『GRANBLUE FANTASY: Relink - Endless Ragnarok』の開発速度と品質を守るCI運用
cygames
PRO
0
120
OSPN.JPバージョンアップ作業進捗のご報告 / 20260801-osc26kyoto
akkiesoft
0
270
QAエンジニア起点で進める、SmartHRにおける信頼性向上について
kaomi_wombat
1
110
修正PRを食べてレビュースキルが賢くなる:Claude Codeによる自己改善サイクル
yuyaumetsu
4
1.2k
AWS ネットワーク構築でハマった(ハマりかけた) 5選とそこから得た教訓
nagisa53
4
180
え?フロントエンドエンジニアの ワイがインフラも!?
puku0x
0
280
Featured
See All Featured
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.8k
Art, The Web, and Tiny UX
lynnandtonic
304
22k
Building the Perfect Custom Keyboard
takai
2
830
Building Applications with DynamoDB
mza
96
7.2k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
30k
Code Review Best Practice
trishagee
74
20k
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
610
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
760
Typedesign – Prime Four
hannesfritz
42
3.1k
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
1
6k
Paper Plane (Part 1)
katiecoart
PRO
1
10k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
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)