JavaScriptで大きなアプリケーションを作る場合、適切にクラス設計した方がメンテナビリティは高くなります.
そこで、JavaScriptのキレイなClassの作り方を紹介します.
ES6を使わず、現行のJavaScript仕様で実現出来るClassの作り方です.
まずはコードを見てください.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
var Foo = (function() { // コンストラクタはクラス名と同一の関数名で定義する function Foo() { // private な変数はここで定義する. // 言語仕様上privateには出来ない. // _から始まる変数名にすることでprivateであることを示す. this._bar = "some value"; }; // this._barにアクセスしているので、_barの値は各インスタンス毎に保持できる Foo.prototype.getBar = function() { return this._bar; }; Foo.prototype.setBar = function(bar) { this._bar = bar; }; // private staticな変数であれば言語仕様上もprivateを実現できる. privateStaticVal = "test"; // staticな変数へのアクセスにはthisをつけない. Foo.prototype.getStaticVal = function() { return privateStaticVal; }; Foo.prototype.setStaticVal = function(val) { privateStaticVal = val; }; return Foo; })(); |
ポイントは、
- ネームスペースを汚染しないよう、即時実行関数内に定義している.
- privateな変数については命名規則(“_”アンダースコアで始める)によって表現する.
- instance毎に違う値を持たせるために、thisのプロパティとしてを保持させる
- static private な変数は従来の言語仕様でも実現できている.
Classを利用する場合は以下のようなコードになります.
1 2 3 4 5 6 7 |
<span class="kwd">var</span><span class="pln"> a </span><span class="pun">=</span> <span class="kwd">new</span> <span class="typ">Foo</span><span class="pun">();</span> <span class="kwd">var</span><span class="pln"> b </span><span class="pun">=</span> <span class="kwd">new</span> <span class="typ">Foo</span><span class="pun">();</span><span class="pln"> a</span><span class="pun">.</span><span class="pln">setBar</span><span class="pun">(</span><span class="str">'a'</span><span class="pun">);</span><span class="pln"> b</span><span class="pun">.</span><span class="pln">setBar</span><span class="pun">(</span><span class="str">'b'</span><span class="pun">);</span><span class="pln"> alert</span><span class="pun">(</span><span class="pln">a</span><span class="pun">.</span><span class="pln">getBar</span><span class="pun">());</span> <span class="com">// 'a' が表示される </span><span class="pln"> alert</span><span class="pun">(</span><span class="pln">b</span><span class="pun">.</span><span class="pln">getBar</span><span class="pun">());</span> <span class="com">// 'b' が表示される </span> |
Stackflowのエントリーを参考に書いているので、一定程度の支持は得られているかと思います.