0

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

+1

Sie verlassen sich auf Ihr C# -Wissen, um zu verstehen, wie JS funktioniert? –

+1

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

+0

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

Antwort

0

In Ihrem Schwimmer und Läufer Bauer, haben Sie die anrufen Basisklasse 'Konstruktor wie folgt:

var Swimmer = function(theName, theCountry, theUnit) { 
    Athlete.call(this, theName, theCountry, theUnit); 
}; 
0

Was Sie eigentlich wollen, ist ein Konstruktor in Ihrer Unterklasse zu erben. Dies geschieht nicht automatisch in JS. Sie müssen den Elternklassenkonstruktor in Ihrem Unterklassenkonstruktor manuell aufrufen.

Wie Sie in this article sehen, die Ihr eigenes Muster verwendet, ist die allgemeine Lösung dies. An diesem Punkt

var Swimmer = function(theName, theCountry, theUnit) { 
    Athlete.apply(this, arguments) 
}; 

wenn nicht für das Lesen zu vereinfachen könnten Sie auch nicht die Argumente in Ihrer Unterklasse Konstruktor definieren

var Runner = function() { 
    Athlete.apply(this, arguments) 
}; 

Der Oberklassenkonstruktors wird automatisch aufgerufen, wenn inhereting. Es gibt keine nicht-hässliche Möglichkeit, zuerst zu erben, dann etwas zu tun und dann den Superklassenkonstruktor aufzurufen.

+0

Beispiel aktualisiert jetzt arbeiten mit überflüssig, dass = das entfernt. Ich hatte nicht über die Elternkonstruktorvererbung und die "Anwenden" -Methode erkannt. – MagicLuckyCat