山田 祥寛.著 改訂新版JavaScript本格入門 ~モダンスタイルによる基礎から現場での応用まで。
JS本格入門
-5.5.1 クラスを定義する
-プロパティを定義する
-リスト5-31
class_prop.js
class Member { //コンストラクター constructor(firstName, lastName){ this.firstName = firstName; this.lastName = lastName; } //firstNameプロパティ get firstName(){ return this._firstName; } set firstName(value){ this._firstName = value; } //lastNameプロパティ get lastName(){ return this._lastName; } set lastName(value){ this._lastName = value; } // getName(){ return this.lastName + this.firstName; } }
これの意味って何か?と問われて、少し困った件について。。。
(_)アンダースコア、アンダーバーがついているのは、プライベートなプロパティじゃね?と思ったので、全部プロパティにアンダーバーつけたほうがいいんじゃね?って思ったんだけど、たぶんそういう問題じゃあないらしい。。
つまり、これはよく考えると…ゲッターとセッターとして機能させているという説明らしい…であるならば、get lastNameのthis._lastNameはプライベート・プロパティであり、getNameメソッドのthis.lastNameはgetterのlatsNameメソッドだ…ということになる…であっていると思っている。
どうでしょう?
これでも、
m.getName();
>”山田太郎”
これでも、
m.lastName + m.firstName;
> “山田太郎”
同じ結果が返却される。
ちなみに、これでも同じ結果が返る。(JavaScript的にはオブジェクト指向は糖衣構文でアクセッサは意味がなさないので当然ってことなんだろうけど…)
m._lastName + m._firstName;
> “山田太郎”
生Jsやっている人からすれば当たり前なんですけど。まあ、そういうオブジェクト指向信者(Java派のOPP信者)のための書き方ができるようになったということと理解した。
JavaScriptもJavaやC#のようなオブジェクト指向言語風にかけるけるようにしたけど、プラベートメソッドやプライベートプロパティという考えはそもそもない…。
だから、
let m = new Member(“太郎”, “山田”);
console.log(m._lastName);
などとやっても動いてしまう。
一般的なオブジェクト指向言語ならば、console.log(m._lastName);の行でエラーになります。アンスコが頭についている時点で、クラス外で使用するのは許可されない。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn.qiita.com%2Fassets%2Fpublic%2Farticle-ogp-background-412672c5f0600ab9a64263b751f1bc81.png?ixlib=rb-4.0.0&w=1200&mark64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTk3MiZoPTM3OCZ0eHQ9JUUzJTgwJTkwJUU1JTg1JUE4JUUzJTgxJUE2JUUzJTgxJUFFSlMlRTMlODElQUUlRTMlODIlQUElRTMlODMlOTYlRTMlODIlQjglRTMlODIlQTclRTMlODIlQUYlRTMlODMlODglRTYlOEMlODclRTUlOTAlOTElRTUlQUIlOEMlRTMlODElODQlRTMlODMlOUUlRTMlODMlQjMlRTMlODElQUIlRTUlOTElOEElRTMlODElOTAlRTMlODAlOTFFUzYlRTMlODElQUVjbGFzcyVFNiVBNyU4QiVFNiU5NiU4NyVFMyU4MSU4QyVFNyVCNCVBMCVFNiU5NSVCNSVFMyU4MSU5OSVFMyU4MSU4RSVFMyU4MSVBNiVFOSVCQyVCQiVFNiVCMCVCNCVFMyU4MSU4QyVFNiVBRCVBMiVFMyU4MSVCRSVFMyU4MiU4OSVFMyU4MSVBQSVFMyU4MSU4NCZ0eHQtYWxpZ249bGVmdCUyQ3RvcCZ0eHQtY29sb3I9JTIzMUUyMTIxJnR4dC1mb250PUhpcmFnaW5vJTIwU2FucyUyMFc2JnR4dC1zaXplPTU2JnM9OTNlNWM4YzFmNTU1ZTQyYTZkYjcxNzE5MTQ4Mjg5MzE&mark-x=142&mark-y=57&blend64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZoPTc2Jnc9NzcwJnR4dD0lNDB5YXMtbnlhbiZ0eHQtY29sb3I9JTIzMUUyMTIxJnR4dC1mb250PUhpcmFnaW5vJTIwU2FucyUyMFc2JnR4dC1zaXplPTM2JnR4dC1hbGlnbj1sZWZ0JTJDdG9wJnM9NzI2ODJiYWRjMDU5NzRkZjAyMTg5ZjJjZWVhZmY5ZWI&blend-x=142&blend-y=486&blend-mode=normal&s=510cca21b345989593a8cf595fd75c06)
今回のclass構文は、JavaやC++の様に本質的なclassの仕組みが実装されたわけではありません。糖衣構文という激アマな仕組みによって、prototypeカスが麗しいclassの形をしているだけなのです。
この1文がすべてを物語っている気がします。
Js怖いというかJsはチープというか、生Jsは使うべきじゃないと言うべきか…。
コメント