Est-il possible d'empêcher le remplacement / l'écrasement des fonctions / variables dans l'instance singleton?

Considérer cette 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);

Si jamais quelqu'un voulait manipuler ce code (un utilisateur malveillant par exemple), il serait de réécrire le is_allowed fonction avec les siens, par exemple, à l'aide de la barre d'adresse (il n'a pas firebug, qui sait).

javascript:(function(){ window.instance.is_allowed = function(){ return true; } })();

C'est un naïf exemple, mais c'est le point, rien en Javascript peut être écrasé.

Je sais que dans l'es5, nous avons l'Objet.defineProperty de sorte que vous pouvez définir:

//being explicit
Object.defineProperty(instance, "is_allowed", {
  enumerable: false,
  configurable: false,
  writable: false,
  value: function(){
    //do checks
  }    
});

En fait, ce qui est MIEUX dans ce sens est l'utilisation de Object.freeze(instance) ou Object.seal(instance) au lieu de Object.definePropertydepuis le plus tard peut être appelé à nouveau avec writable: false (bête hein?)

Est-il possible qu'il travail dans les vieux navigateurs (à savoir IE6-8) sans trop de tracas? Si c'est impossible, alors je vais simplement hausser les épaules et de passer.

source d'informationauteur pocesar | 2013-02-03