Hallo,
Folgendes Problem, ich habe ein Objekt notificationCenter das ich einem neu zu erstellenden Objekt mitgeben möchte, es soll aber auch schon im Konstruktor verfügbar sein. Ist das irgendwie möglich? Ich dachte da an Interitance oder so. Mein Ansatz hier funktioniert so weit ich verstehe schon mal:
function ExtensibleObject(properties) {
for(var propertyName in properties) {
this[propertyName] = properties[propertyName];
}
}
function Player(name) {
this.name = name;
this.notificationCenter.log("Player " + this.name + " created");
}
function NotificationCenter() {}
NotificationCenter.prototype.log = function(something) {
console.log(something);
}
function Factory() {
this.notificationCenter = new NotificationCenter()
}
Factory.prototype.create = function() { // (module, [arg1, arg2, ...])
if (arguments.length < 1)
throw 'Too fiew arguments';
if (typeof arguments[0] != 'function')
throw arguments[0] + ' is not a function';
var module = arguments[0];
module.prototype = new ExtensibleObject({
notificationCenter: notificationCenter
});
return new (module.bind.apply(module, arguments))();
}
// this is like you use it:
var myFactory = new Factory();
var aPlayer = myFactory.create(Player, "jeena");
// >> "Player jeena created"
aPlayer.notificationCenter.log("logging something");
// >> "logging something"
console.log(aPlayer.name)
// >> "jeena"
Das ist hier etwas einfacher dargestellt, in wirklichkeit gibt es mehr als eine Factory und das NotificationCenter hat komplett andere Aufgaben.
Irgendwie gefällt mir das ganze aber nicht so ganz richtig, weil mir das ExtensibleObject unnötig erscheint, ich habe aber nach alternativen geschaut und leider keine gefunden. Ich wollte mit Object.create() arbeiten aber da kann ich dann nichts an den Konstruktor übergeben was mir doch sehr komisch erscheint, vielleicht habe ich die ganzen Object und Function Methoden bisher einfach nur noch nicht wirklich verstanden. Mein Ansatz war in der Factory.create() so was reinzumachen:
Factory.prototype.create = function() { // (module, [arg1, arg2, ...])
var module = arguments[0];
return Object.create(module.prototype, {
notificationCenter: {value: this.notificationCenter}
});
}
Was natürlich nicht geht weil da die argumente nicht an Player übergeben werden können.
Vielleicht hat jemand von euch eine Idee wie ich sonst so ein NotificationCenter implementieren könnte worauf eine gewisse Gruppe von Playern zugriff hätte ohne dass ich es jedes mal von Hand übergeben/setzen müsste?
Jeena