JavaScript でコンストラクタを隠蔽する
2011-03-06 23:07:42
思いつきをメモ.
良い点
- コンストラクタが隠蔽される
JavaScript では, オブジェクトのコンストラクタは関数として定義されます.
なので, new Constructor と呼び出すべきなのに, Constructor() というように呼び出されることもあり得ます. - インスタンスメソッドも隠蔽される
Dog.create() でオブジェクトが生成されるまでは, greet() メソッドは見えません.
オブジェクトを通してしか, インスタンスメソッドにアクセスできないということです.
悪い点
- create() の定義が面倒
create() に渡された引数を, init() に渡さないといけないので, 定義がやや煩雑です.
Function.apply() が使えれば, arguments を渡すだけで良さそうですが, コンストラクタを Function.apply() で呼び出すことってできるんでしょうか?
解決策としては, 引数を全てハッシュ変数 (Object) にする, というのが考えられます. - これで本当に幸になれるのか微妙
JavaScript では private や protected といった修飾子で, メソッドを隠蔽することはできません.
普通に定義する create メソと, コンストラクタもメソッドも明け透けな状態にあります.
しかし, そこは開発者の良心に委ねることでも十分解決できるのではないでしょうか.
「アンダースコアから始まるメソッド, プロパティはプライベート扱い」という紳士協定を共有すればいいのではないでしょうか.
Python は, そういった文化の中で利用されている言語のひとつでしょう.