Рассмотрим этот псевдокод:
(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) или Object.seal(instance) вместо Object.defineProperty, так как последнее можно снова вызвать с помощью writable: false (глупо, да?)
Есть ли ЛЮБОЙ способ, чтобы он работал в старых браузерах (а именно IE6-8) без особых хлопот? Если это невозможно, то я просто пожму плечами и пойду дальше.
Object.definePropertiesи заморозю весь свой синглтон, когда API будет доступен... - person pocesar   schedule 03.02.2013Object.freeze. - person Felix Kling   schedule 03.02.2013