Christoph: 'besondere' Objekte im IE klonen

Moin.

Mein Problem: der IE unterstützt die prototype-Eigenschaft nicht, wenn der zugewiesene Prototyp ein 'besonderes' Objekt ist. Z.B.:

  
function Func() {}  
Func.prototype = document;  
var obj = new Func();  
document.writeln(typeof obj.writeln);  
obj.writeln('es geht!');  

Meine erste Idee war nun, über eine for...in-Schleife alle Eigenschaften des Prototyps durchzugehen und diese gegebenenfalls explizit zu setzen. Leider war dies nicht zielführend, da einige 'besondere' Objekteigenschaften nicht durchlaufen werden. Z.B.:

  
for(var slot in document)  
    document.writeln(slot); // writeln taucht in der Ausgabe nicht auf!  

Wenn man die Eigenschaft jedoch explizit setzt, funktioniert es:

  
function Func() {}  
Func.prototype = document;  
var obj = new Func();  
if(obj['writeln'] !== document['writeln'])  
 obj['writeln'] = document['writeln'];  
document.writeln(typeof obj.writeln);  
obj.writeln('es geht!');  

Hat jemand eine Idee, wie man das automatisieren kann, oder gibt es keine andere Möglichkeit, als jede benötigte Eigenschaft explizit zu überprüfen?

Christoph

PS: Ziel der Übung ist eine Realisierung von Javascript-Bibliotheken; im Firefox scheint auch alles wie gewünscht zu klappen, im IE dank obigem Problem nur, wenn benötigte Objekteigenschaften explizit gestezt werden

  1. Hallo,

    Interessant, aber sorry, eine Lösung fällt mir gerade nicht ein, aber folgendes stimmt wohl eher nicht:

    im Firefox scheint auch alles wie gewünscht zu klappen

    Deine Funktion

    function clone(parent) {
      function Func() {}
      Func.prototype = parent;
      var obj = new Func();
      for(var i = 1; i < arguments.length;)
       obj[arguments[i++]] = arguments[i++];
      return obj;
     }

    ist nämlich ein bisschen übereifrig beim inkrementieren von i. Da fehlt nachher etwas, wie man leicht überprüfen kann:

    var klon = clone( {a:"A"}, "B", "C");
    for(var p in klon){alert(klon[p]);};

    Nimm lieber das übliche:

    for(var i = 1; i < arguments.length; i++)
       obj[arguments[i]] = arguments[i];

    Dann bekommst du auch wirklich jedes "argument".

    Gruß, Don P

    1. Moin.

      Deine Funktion [...]
      ist nämlich ein bisschen übereifrig beim inkrementieren von i. Da fehlt nachher etwas, wie man leicht überprüfen kann [...]

      Das ist das gewünschte Verhalten, da die Funktion wie folgt aufgerufen wird:

        
          clone(obj, name1, value1, name2, value2, ...)  
      
      

      Christoph

      1. Hallo,

        Das ist das gewünschte Verhalten, da die Funktion wie folgt aufgerufen wird:

        clone(obj, name1, value1, name2, value2, ...)

        
        > Christoph  
          
        Ach so, hatte ich übersehen. Dann ist es ja ok.  
          
        Gruß, Don P  
        
        
  2. Moin.

    PS: Ziel der Übung ist eine Realisierung von Javascript-Bibliotheken

    ...die  es inzwischen zu einer ersten (pre-?)alpha-Version gebracht hat.

    Was haltet ihr von dem Konzept?

    Christoph