• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Objekte klonen mit Javascript

Gilles

Blogger
Hallo Leute,
ich habe ein Logging-Framework geschrieben mit dem ich mir Log-Objekte erstellen kann. Das sieht ungefähr so aus

Code:
window.loggerfactory.addLogger("logid",{
  "level" : "debug"
  "appender" : new ConsoleAppender(),
  "logName" : "AppName"
});

in der Logger-Factory wird nun ein Logger-Objekt mit den passenden Konfigurationen erstellt. Das wird dann ungefähr so abgespeichert.

Code:
this.logger['logid'] = new Logger({
  "level" : "debug",
  "appender" : consoleAppenderObject,
  "logName" : "AppName"
});

Jetzt hab ich auch so einen tollen Logger mit all seinen Einstellungen in der Factory liegen. Die Factory ist über das window Objekt registriert, damit ich in jedem meiner Objekte darauf Zugriff habe.
Nun sehen meine "Klassen"-Objekte in vereinfachter Weise so aus:
Code:
function Komponente(_config) {
 var log; 
 var options = {
      "debug" : "logId",
      "logName" : "KomponentenName"
  }; 
 
 
 var construct = function(config) {
    log = window.loggerfactory.getLogger(options.debug);
    log.setOptions({"logName" : options.logName});
 };

  var doIt = function() {
     log.debug("Hello World");
  };

  construct(_config);
};

Nun passiert folgendes bei loggerfactory.getLogger
Code:
this.getLogger = function(id) {
  return this.logger[id]; 
};

Diese Logger-Instanz verwende ich nun in mehreren Komponenten. Wenn ich dann die Option setOptions aufrufe wird der Name auch in den anderen Komponenten geändert, da ich immer auf das gleiche Objekt zugreife.

Nun meine eigentliche Frage. Kann ich nicht irgendwie ein geklontes Objekt zurückgeben?
Ich habe bereits gegoogled, aber bisher nur Varianten gefunden, die mir das Objekt mit seinen globalen Variablen kopiert (Quasi alles was über objectname.varname ansteuerbar ist). Leider benutze ich auch lokale Variablen in dem Objekt.
Kennt jemand von euch da einen Kniff? :)
 
Werbung:
Diese Logger-Instanz verwende ich nun in mehreren Komponenten. Wenn ich dann die Option setOptions aufrufe wird der Name auch in den anderen Komponenten geändert, da ich immer auf das gleiche Objekt zugreife.
Ich kann irgendwie nicht nachvollziehen, was dein Problem ist. Welcher Name wird geändert? Und warum ist das verkehrt? Wenn du mehrere unterschiedliche Objekte haben willst, warum erzeugst du sie nicht einfach?
 
hi, ich hab nicht wirklich gelesen, um was es dir geht, aber wenn du in JavaScript Objekte klonen willst, geht das z.B. mit jQuery:
a = $.extend({}, b);
(also a ist ein Klon von b);
oder schreib dir doch deine eigene Funktion dazu, ich benutze das hier:

Code:
Object.defineProperty(Object.prototype, "feat", {value: function(obj, num)    {
    
    if    (typeof num == "object")    {
        var def = num;
    }    else if    (typeof num == "number")    {
        var def = {writable:((num & 4) == 4), enumerable:((num & 2) == 2), configurable:((num & 1) == 1)};
    }
    
    for    (var i in obj)    {
        var desc = Object.getOwnPropertyDescriptor(obj, i);
        
        if    (typeof this[i] == "object")    {
            //extend a object
            this[i].feat(obj[i]);
            
        }    else    {
            //define the getter
            for    (var j in def)    {
                if    (!((desc.get || desc.set) && (j == "writable" || j == "value")))
                    desc[j] = def[j];
            }
            
            Object.defineProperty(this, i, desc);
            
        }
    }
    
    return this;
}});

Hiermit kannst du auch noch mehr machen, als blos zu klonen. Klonen geht aber so:
a = ({}).feat(b);


ich hoffe es nützt dir irgendwas...
 
Werbung:
Ich halte das Klonen an dieser Stelle auch nicht für den richtigen Ansatz.

Nur der Vollständigkeit halber: „deep copy“ könnte noch ein Suchbegriff sein.
 
Zurück
Oben