2016-07-23 14 views
0

Problem: Ich versuche, einen Konstruktor Funktion namens Wizard zu erstellen, die zwei Parameter verwendet: Name und Zauber, und dann ein Objekt-Assistenten erstellen:Wie erstellt man eine Konstruktorfunktion?

„Jede einzelne Instanz des Assistenten einen Namen Eigenschaft haben muss (a string), eine Spells-Eigenschaft, die ein Array von Strings darstellt, und eine castSpell-Methode, die einen zufälligen Spell im String-Format zurückgeben kann. "

Das Objekt hat die folgenden Eigenschaften: Name ist "Gorrok" (String), und Zaubersprüche sind "Abrakadabra" und "Cadabraabra" (Array).

Ziel: die castSpell Methode aufzurufen, wie so einen zufälligen Zauber anzuzeigen: Gorrok: Abrakadabra

-Code: Ich habe den folgenden Code bisher nur geschrieben, und ich bin feststecken in diesem Stadium!

function Wizard(name, spells){ 
    this.name = name; 
    this.spells = [spells]; 
    this.castSpell = function(){ 
     var v = Math.random(); 
     if (v >= 1) 
      document.write(this.name + " : " + this.spells[0]); 
     else 
      document.write(this.name + " : " + this.spells[1]); 
    } 
} 
var w = new Wizard("Gorrok", "abracadabra", "cadabraabra"); 
w.castSpell(); 

Antwort

2

So Math.random() wird eine Zahl zwischen 0 und 1 zurückkehren, so dass es dann nie größer als 1.

auch sein, können Sie die verbleibenden Argumente auf ein Array nicht konvertieren, wie Sie haben .

Simplest fix:

function Wizard(name, spells){ 
    this.name = name; 
    this.spells = spells; // assume spells is already an array 
    this.castSpell = function(){ 
     var v = Math.random(); 
     if (v >= 0.5) 
      document.write(this.name + " : " + this.spells[0]); 
     else 
      document.write(this.name + " : " + this.spells[1]); 
    } 
} 
var w = new Wizard("Gorrok", ["abracadabra", "cadabraabra"]); 
w.castSpell(); 
0

können Sie auch Math.round() benutzen Sie 0 oder 1 zufällig

var v = Math.round(Math.random()); 
document.write(this.name + " : " + this.spells[v]); 
+0

Diese Art der schlurfenden war neu für mich, ich mag, was Sie dort taten. In welchen Situationen würden Sie Math.round (Math.random()) genau verwenden? Und können Sie andere Mathe-Klassen in sich verwenden? – ratboy

+0

'Math.random' gibt einen Gleitkommawert zwischen 0 und 1 zurück,' Math.round' rundet einen Gleitkommawert auf die nächste ganze Zahl ab. Sie sind nicht eingeschränkt, wenn Sie Math. {SomeFunction} -Ergebnis verwenden. Es kann geschrieben werden wie 'var floatBetween0and1 = Math.random(); var number0or1 = Math.round (floatBetween0and1) ' – Freez

1

denke ich, Paul Antwort richtig ist. Verwenden Sie für Funktionen, die nicht in ctor sind, einen Prototyp. Prototypen erlauben auch das Hinzufügen von Member-Variablen, die nicht im Konstruktor definiert sind.

Hier ist ein Beispiel von w3:

function Person(first, last, age, eyecolor) { 
    this.firstName = first; 
    this.lastName = last; 
    this.age = age; 
    this.eyeColor = eyecolor; 
} 
Person.prototype.nationality = "English"; 
+0

Es ist erwähnenswert, dass die Verwendung des Prototyps einen zusätzlichen Vorteil bei der Speicherzuweisung in den meisten Javascript-Laufzeitumgebungen bietet. Wenn eine Funktion im Konstruktor definiert ist, weist sie jeder Instanz des Objekts eine neue Instanz der Funktion zu, während die Verwendung des Prototyps, wie dieser Beantworter getan hat, allen Instanzen der Klasse nur eine Kopie der Funktion zuweist. – Paul

Verwandte Themen