次の疑似コードを検討してください。
(function(window){
var options = { /*where everything goes */ };
var instance = (function(options){
for (var i in options){
if (options.hasOwnProperty(i)){
this[i] = options[i];
}
}
})(options);
instance.callbacks = function(cb){
//...
}
instance.is_allowed = function()
//... checks, return boolean
}
window.instance = instance;
})(this);
誰かがこのコードを操作したいと思った場合 (たとえば、悪意のあるユーザー)、is_allowed
たとえば、アドレス バーを使用して関数を独自に書き換えます (彼は firebug を持っていません)。
javascript:(function(){ window.instance.is_allowed = function(){ return true; } })();
これは単純な例ですが、それがポイントです。Javascript では何でも上書きできます。
es5 には Object.defineProperty があることを知っているので、次のように設定できます。
// being explicit
Object.defineProperty(instance, "is_allowed", {
enumerable: false,
configurable: false,
writable: false,
value: function(){
// do checks
}
});
実際、この意味で最も良いのは、Object.freeze(instance)
orObject.seal(instance)
の代わりに使用することです。Object.defineProperty
writable: false
古いブラウザー (つまり IE6-8) で手間をかけずに動作する方法はありますか? それが不可能なら、肩をすくめて先に進みます。