Gibt es eine Möglichkeit zu verhindern, überschreiben/überschreiben von Funktionen/Variablen singleton-Instanz?

Betrachten dieser 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);

Wenn jemand jemals gewünscht, um zu manipulieren-code (ein böswilliger Benutzer zum Beispiel), er würde schreiben, die is_allowed Funktion mit seinem eigenen, zum Beispiel über die Adressleiste (die er nicht haben firebug, wer weiß).

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

Dies ist ein naives Beispiel, aber das ist der Punkt, alles in Javascript überschrieben werden kann.

Ich weiß, in es5 haben wir das Objekt.defineProperty so können Sie set:

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

Eigentlich, was das BESTE in diesem Sinne ist die Verwendung Object.freeze(instance) oder Object.seal(instance) statt Object.definePropertyda die später erneut aufgerufen werden kann, mit writable: false (albern, nicht wahr?)

Gibt es eine Möglichkeit, dass es funktioniert in alten Browsern (nämlich IE6-8), ohne zu viel Aufwand? Wenn es unmöglich ist, dann werde ich nur Schulterzucken und weitergehen.

InformationsquelleAutor der Frage pocesar | 2013-02-03

Schreibe einen Kommentar