Рассмотрим этот псевдокод:
(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
}
});
На самом деле, что BEST в этом смысле состоит в том, чтобы использовать Object.freeze(instance)
или Object.seal(instance)
вместо Object.defineProperty
, так как позже можно снова вызвать с помощью writable: false
(глупый huh?)
Есть ли какой-либо способ работать в старых браузерах (а именно IE6-8) без лишних хлопот? Если это невозможно, тогда я просто пожимаю плечами и двигаюсь дальше.