Re: Singleton
あかまです。
JavaScript-2.0 を知らないので、以下は JavaScript-1.2 での説明です。
ので、最近は変わっているのかも知れません。
-*-
JavaScript-1.2 では
* クラスから生成されるオブジェクトの数を制限することはできません。
* コンストラクタを private にすることもできません。
* オブジェクトごとの private な変数を定めることができません。
といった仕様が存在します。
つまり、Singleton パタンは実現できません。
全てのメソッドとプロパティを static にしたクラスを作成することはでき
ますので、こちらで代用することになります。
たとえば次のような感じになります。
<script type="text/javascript">
function Hoge()
{
function getA() { return Hoge.prototype.a; }
function setB(_b) { b = _b; }
function getB() { return b; }
Hoge.prototype.a = null;
Hoge.prototype.getA = getA;
var b;
Hoge.prototype.setB = setB;
Hoge.prototype.getB = getB;
}
Hoge();
Hoge.prototype.a = 1;
document.write( Hoge.prototype.getA() );
Hoge.prototype.setB( 2 );
document.write( Hoge.prototype.getB() );
</script>
しかし、この用法には制限事項が山ほどあります。またデバッグが非常にし
にくい言語仕様も存在します。はっきりいって実用になりません。
(1) 上のサンプルで prototype を書き忘れると動作しなくなります。
「Hoge.a = 10;」などと書いてしまうですね。
しかし、そのくせして、prototype を書き忘れても警告がでません。
prototype を書かない場合の動作が別に定められているからです。
(2) 外部からメソッドの上書きを許してしまいます。protect することが
できません。
「Hoge.prototype.getA = 100;」 などと上書きできてしまいます。
JavaScriptでライブラリを提供する際は、プログラマがライブラリの利用の
仕方を完全に理解していることが前提となります。
JavaScript から Java に入った人ならば Java の高機能さと言語仕様の美し
さに感激するでしょうが、Java になれた人が JavaScript を使うと発狂する
でしょう。補助的に使う分には JavaScript はとても便利なものなのですが。
--
赤間俊一 akama@home.so-net.ne.jp
Fnews-brouse 1.9(20180406) -- by Mizuno, MWE <mwe@ccsf.jp>
GnuPG Key ID = ECC8A735
GnuPG Key fingerprint = 9BE6 B9E9 55A5 A499 CD51 946E 9BDC 7870 ECC8 A735