2016-05-05 7 views
-1

Diese Frage zu meiner vorherigen Frage zusammenhängt (using window as a prototype returns seemingly wrong values in javascript), die von @ Stubb0rn beantwortet wurde, aber ich stand vor einer weiteren Problem:Fenster als Prototyp macht seltsam SetTimeout verhalten

function W(){ 
    var w=this; 
    Object.defineProperty(this,'window',{configurable:true,enumerable:true,writable:false,value:w}); 
} 
W.prototype=window; 
window.setTimeout(function(){console.log("123")});  // works ok 
(new W()).setTimeout(function(){console.log("123")}); // throws Uncaught TypeError: Illegal invocation(…) 

Bitte beachten Sie, ich Chrom bin mit

zu testen
+1

Warum erstellen Sie immer Objekte, die vom Fenster erben? – evolutionxbox

+0

WTH versuchst du zu tun? 'setTimeout' muss in einer' Window'-Instanz aufgerufen werden, bei einem 'W'-Objekt funktioniert es nicht. – Bergi

+0

@Bergi Ich habe versucht, Bibliotheken zu kapseln, die AMD/requires nicht unterstützen und den globalen Raum verschmutzen. Ich wollte, dass sie ein Fensterobjekt haben, das sie verschmutzen können, aber nicht das reale Fensterobjekt und gleichzeitig, wenn sie Fenster in ihrem Code verwenden (wie window.setTimeout etc ...) wollte ich auch, dass es weiter so arbeitet gewöhnlich. Bitte sehen Sie meine Antwort –

Antwort

0

es gelöst, es stellt sich native Funktionen muss aus Fenster Kontext aufgerufen werden, so dass ich die Funktionen in Fenster beendet Bindung und Doppel-Prototyping zu tun wie das, was folgt:

function define(w){ // for testing I use requirejs define instead 
    window.Test123=w; 
} 
(function(){ 
    function WBase(){ 
     for(var i in window){ 
      if(typeof window[i]=='function'){ 
       this[i]=window[i].bind(window); 
      } 
     } 
    } 
    WBase.prototype=window; 
    function W(){ 
     var w=this; 
     Object.defineProperty(this,'window',{configurable:true,enumerable:true,writable:false,value:w}); 
    } 
    W.prototype=new WBase(); 
    define(function(){ 
     var windowAlias=new W(); 
     return (function(window){ 
      var ret={}; // returns only the variables added to the alias window object 
      with(window){ 

       // CODE FROM MODULE HERE WILL HAVE an alias to "window" wich means if it adds variables to window (global scope) it will be prevented and instead added to the alias window 

       for(var i in window){ 
        if(window.hasOwnProperty(i)&&i!='window') 
         ret[i]=window[i]; 
       } 
      } 
      return ret; 
     }).call(windowAlias,windowAlias) 
    }); 
})(); 

Test123(); // for testing 

Versuchen Sie, jquery anstelle eines Kommentars einzufügen (// CODE VON MODUL HIER ...), Sie erhalten ein Objekt mit den Eigenschaften jQuery und $ und sie werden nicht zum globalen Bereich hinzugefügt. und ich habe am Ende eine Seite erstellt, die diese Zeilen dynamisch an Javascript-Dateien anfügt, die durch querystring angefordert werden.