Ich habe versucht, ein JavaScript-Factory-Musterbeispiel zu erstellen, das eine allgemeine Abstraktion mit Prototyp-Vererbung verwendet, aber die Werte im Konsolenprotokoll werden nicht definiert zurückgegeben.Inherited JavaScript Object verliert Eigenschaftswerte
var AthleteFactory = function() {
var athlete, that = this;
this.createAthlete = function(athleteType, athleteName, athleteCountry, athleteUnit) {
switch (athleteType) {
case "Swimmer":
athlete = new Swimmer(athleteName, athleteCountry, athleteUnit);
break;
case "Runner":
athlete = new Runner(athleteName, athleteCountry, athleteUnit);
break;
}
return athlete;
}
};
Im Folgenden finden Sie Konstruktor:
function Athlete(theName, theCountry, theUnit) {
this.name = theName;
this.country = theCountry;
this.distance = 0;
this.unit = theUnit;
};
Athlet Objekt (Zusammenfassung/Basisobjekt)
Athlete.prototype = {
constructor: Athlete,
recordDistance: function(distance) {
this.distance += distance;
},
showProgress: function() {
$("#output").append("<h1>" + this.name + " of " + this.country + " has achieved: " + this.distance + this.unit + "</h1>");
},
};
Erweitere Basis Athlet Objekt
var Swimmer = function(theName, theCountry, theUnit) {};
Swimmer.prototype = new Athlete();
Swimmer.prototype.DoExercise = function(difficulty) {
switch (difficulty) {
case "easy":
this.recordDistance(20);
break;
case "moderate":
this.recordDistance(50);
break;
case "hard":
this.recordDistance(100);
break;
};
};
Die DoExercise logische Unterschiede enthält daher die Fabrikmuster
var Runner = function(theName, theCountry, theUnit) {};
Runner.prototype = new Athlete();
Runner.prototype.DoExercise = function(difficulty) {
switch (difficulty) {
case "easy":
this.recordDistance(5);
break;
case "moderate":
this.recordDistance(20);
break;
case "hard":
this.recordDistance(60);
break;
};
};
//create some athletes in our factory
var factory = new AthleteFactory();
var phelps = factory.createAthlete("Swimmer", "Micheal Phelps", "USA", "Metres");
console.log(phelps);
var farah = factory.createAthlete("Runner", "Mo Farah", "UK", "Kilometres");
console.log(farah);
phelps.DoExercise("easy");
phelps.DoExercise("moderate");
phelps.DoExercise("hard");
phelps.showProgress(); //undefined of undefined has achieved: 170undefined
farah.DoExercise("moderate");
farah.DoExercise("easy");
farah.DoExercise("hard");
farah.showProgress(); //undefined of undefined has achieved: 85undefined
ich von einem C# -Hintergrund bin eher als Javascript so bin Mißverständnis einen fundamentalen Unterschied oder zwei, die ich möglicherweise. Obwohl ich nur getrennte Funktionen schaffen könnte die gleiche Aufgabe zu erreichen, wäre es schön, diese Funktion zu erhalten,
Hier ist der codepen Link: http://codepen.io/paulcthomas/pen/aNLJyq?editors=1010
Sie verlassen sich auf Ihr C# -Wissen, um zu verstehen, wie JS funktioniert? –
Dieses Beispiel ist viel zu kompliziert für jemanden, der gerade mit Javascript-Objekten und Unterklassen beginnt. Beginnen Sie mit einigen Arbeitsbeispielen aus einem vorhandenen Lernprogramm, erweitern Sie sie dann und testen Sie, wie alles funktionieren soll. Unter anderem sollten Sie 'Object.create()' verwenden, um Ihre Prototypen zu initialisieren, und etwas wie 'that = this' in einer Factory-Funktion macht keinen Sinn. Ernsthaft, beginnen Sie neu, indem Sie einem Javascript-Tutorial folgen, und vergessen Sie fast alles, von dem Sie dachten, Sie würden es aus C++ kennen, es wird Ihnen in die Quere kommen. – jfriend00
Vielleicht ist dies nur mein Punkt, aber weil C# und Javascript ** etwas ** (aufhören zu lachen) anders sind, sollten Sie eher von einigen einfacheren Beispielen zuerst beginnen. Es gibt Unmengen von Möglichkeiten, ein "Fabrik" -Muster zu erstellen, aber Sie sollten zuerst einige Javascript-Tutorials (meist über anonyme Funktionen, ** selbstaufrufende anonyme Funktionen **, asynchrone Rückrufe, Rückrufe in Generälen) überprüfen.Nochmals, nicht, dass Sie das noch nicht erreichen können, aber Ihr Beispiel ist für einen JavaScript-Anfänger so kompliziert, dass es viele Punkte gibt, die zuerst angesprochen werden müssen. – briosheje