Consider this pseudo code:
(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);
If anyone ever wanted to manipulate this code (a malicious user for example), he would rewrite the is_allowed
function with his own, for example, using the address bar (he doesn't have firebug, who knows).
javascript:(function(){ window.instance.is_allowed = function(){ return true; } })();
This is a naive example, but that's the point, anything in Javascript can be overwritten.
I know in es5 we have the Object.defineProperty so you can set:
// being explicit
Object.defineProperty(instance, "is_allowed", {
enumerable: false,
configurable: false,
writable: false,
value: function(){
// do checks
}
});
Actually, what is BEST in this sense is to use Object.freeze(instance)
or Object.seal(instance)
instead of Object.defineProperty
, since the later can be called again with writable: false
(silly huh?)
Is there ANY way that it work in old browsers (namely IE6-8) without too much hassle? If it's impossible, then I'll just shrug and move on.