molily: Übergabe/Vererbung von fertigem Objekt

Beitrag lesen

Factory.prototype.create = function (constructor /*, args */) {

// Objekt mit dem NC erstellen
    var instance = Object.create(constructor.prototype, {
        notificationCenter : {
             value : this.notificationCenter
        }
    });

// Konstruktor methode mit den restlichen Argumenten aufrufen.
    constructor.apply(instance, Array.prototype.slice.call(arguments, [1]));
    return instance;
}

// this is like you use it:
var myFactory = new Factory();

var aPlayer = myFactory.create(Player, "jeena");
// >> "Player jeena created"

Das kommt mir ziemlich gehackt vor. Eigentlich willst du doch nur, dass sich bestimmte Instanzen einen Objektverweis teilen. Warum implementierst du das nicht in den jeweiligen Konstruktoren?

Die obige Lösung ist sehr allgemein und fügt die Funktionalität von außen hinzu. Ich frage mich, muss das so gekapselt sein, dass die letztlichen Konstruktoren nichts wissen, wie es ihnen geschieht? Wieso nicht, sie greifen doch direkt auf this.notificationCenter zu? Wieso sie nicht damit konfigurieren (Objekte by introduction explizit miteinander bekannt machen)?

Was ich nicht verstehe: Die letztlichen Konstruktoren kommen ja nicht ohne die Factory aus, schließlich würde es eine Exception geben, wenn man einfach nur »new Player« aufrufen würde (gegeben dass notificationCenter nicht in der Prototypkette definiert wird). Unter den Umständen ergibt die Trennung wenig Sinn.

Wenn du anfängst, Konstruktoren als einfache Funktionen zu verwenden, die schon ein Objekt mit Eigenschaften hineinbekommen, so kannst du auf den ganzen Factory- und Konstruktorenschmus auch verzichten und rein funktional und prototypisch arbeiten. Dann gibt es einfach Funktionen, die Objekte erzeugen, die ggf. gewisse Prototypen besitzen. Sie können dazu andere Funktionen nutzen, denen sie ggf. eine Konfiguration übergeben.

Funktional gesehen wäre das Erzeugen einer »Factory« nur das Currying der Erzeugerfunktion mit einer gewissen Konfiguration (der notificationCenter-Instanz).

Mathias