2016-12-15 4 views
1

In dem Tutorial, das ich folge, erstelle ich ein Raumschiff, das von der Superklasse Actor erbt. Wenn das Raumschiff Konstruktor erstellen, rufe ich den Schauspieler Konstruktor Actor.call (this, Szene, x, y)HTML5 Spiel Aufruf super Klasse Konstruktor

Kann mir jemand sagen, den Zweck des Actor.call (this, Szene, x, y) Ich nehme an, dass es eine Möglichkeit ist, Wiederholungen zu vermeiden, da ich die Eigenschaften des Actors erben kann (this.scene = scene, this.x = x und this.y = y)?

function Actor(scene, x, y) { 
    this.scene = scene; 
    this.x = x; 
    this.y = y; 
    scene.register(this); 
} 

Actor.prototype.moveTo = function(x, y) { 
    this.x = x; 
    this.y = y; 
    this.scene.draw(); 
}; 

Actor.prototype.draw = function() { 
    var image = this.scene.images[this.type]; 
    this.scene.context.drawImage(image, this.x, this.y); 
}; 

function SpaceShip(scene, x, y) { 
    **Actor.call(this, scene, x, y); // call actor constructor** 
    this.points = 0; 
} 
SpaceShip.prototype = Object.create(Actor.prototype) 

SpaceShip.prototype.type = "spaceShip"; 
SpaceShip.prototype.scorePoint = function() { 
    this.points++; 
}; 
+0

Ist Ihre Frage einfach "was Konstrukteure sind"? – meagar

+0

Meine Frage ist - Im Raumschiff Konstruktor, was ist der Zweck von Actor.call (this, scene, x, y) – stckpete

+0

Haben Sie Java (oder eine ähnliche objektorientierte Sprache) Erfahrung? Wissen Sie auch, wie die prototypische Vererbung in Javascript funktioniert? – valepu

Antwort

1

.call() ist eine besondere Art und Weise eine Funktion in Javascript zu nennen. Mit call können Sie einen anderen Bereich für eine Funktion festlegen (das heißt, wenn Sie this in einer Funktion verwenden, wird es als erster Parameter in call anstelle des normalen Bereichs für diese Funktion übergeben).

In diesem Fall ist es sehr ähnlich zu Javas super(), um den Elternklassenkonstruktor aufzurufen, da es genau das tut, was der Actor-Konstruktor tut, aber auf einer Instanz der Spaceship-Klasse statt einer Instanz der Actor-Klasse. Sie können also sagen, dass sie verwendet wird, also müssen Sie nicht den gleichen Code innerhalb des Konstruktors von Spaceship innerhalb des Spaceship-Konstruktors verwenden, obwohl dies eine vereinfachte Darstellung ist

Auf der MDN-Seite gibt es ein Beispiel dafür, wie verwenden .call() Kettenbauer https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call

Beispiele zu Kettenbauer für ein Objekt

Sie können für ein Objekt, ähnlich wie Java verwenden Aufruf Kette Konstrukteurs Mit Anruf. Im folgenden Beispiel ist der Konstruktor für das Produktobjekt mit zwei Parametern, Name und Preis, definiert. Zwei andere Funktionen Essen und Spielzeug rufen Produkt vorbei und dies und Name und Preis. Produkt initialisiert die Eigenschaften Name und Preis, beide spezialisierten Funktionen definieren die Kategorie.

function Product(name, price) { 
    this.name = name; 
    this.price = price; 

    if (price < 0) { 
    throw RangeError('Cannot create product ' + 
         this.name + ' with a negative price'); 
    } 
} 

function Food(name, price) { 
    Product.call(this, name, price); 
    this.category = 'food'; 
} 

function Toy(name, price) { 
    Product.call(this, name, price); 
    this.category = 'toy'; 
} 

var cheese = new Food('feta', 5); 
var fun = new Toy('robot', 40);