前回の投稿「JavaScriptでOOP – privateぽい関数と変数, staticなやつ」ではstaticな関数と変数を作成しました。
今回はインスタンスが作成できるClassみたいなのにprivateな関数と変数を設定します。
var Product = (function () { var cost = 1000 ,tax = 0.05 ,price = function () { return cost * (tax + 1); } ,main = function () { }; main.prototype = { tax: function (n) { tax = n; } ,price : function () { var p = price(); var t = cost * tax; return [p,t,p-t]; } }; return main; })(); var product = new Product(); console.log(product.price());//[1050,50,1000] product.tax(0.08) console.log(product.price());//[1080,80,1000] |
これで完全にでは無いですがprivateな変数・関数も備わったClassのように使用できます。
new してインスタンスも作れます。
一番の問題はProduct
を上書きできることです。
Class名にあたるProduct
を保護する方法が無いものでしょうか。
update 2011-10-23 22:21
via anonymous : Object.frozen=true
ECMAScript 5にこんなのが追加されてるらしい。
雰囲気的にfrozenなので多分固定化できるんだろうけど使い方がイマイチ分かんないな。
MDN
https://developer.mozilla.org/ja/JavaScript/New_in_JavaScript/1.8.5
msdn
http://msdn.microsoft.com/en-us/library/ff806186(v=vs.94).aspx
ここら辺のリンクだろうなぁ。
update
*privateだけど
private は private だけど static になっちゃうんだよな〜
インスタンス毎に保持できるprivateな関数とか変数はConstructorに書くしかないんだろうか…
2011.10.23 21:28
Object.frozen=true
ピンバック: 宇都宮ウエブ制作所» ブログアーカイブ » Actionscript3erが覚えるJavascriptでのクラス開発まとめ
ピンバック: 超個人的メモ, JavaScript関連の投稿リンクをまとめておく - イナヅマtvログ