HTML5游戏调用超类构造函数

时间:2016-12-15 22:09:32

标签: javascript

在我正在关注的教程中,我正在创建一个将继承Actor超类的宇宙飞船。在创建太空船构造函数时,我使用 Actor.call(this,scene,x,y)

调用Actor构造函数

任何人都可以告诉我 Actor.call(this,scene,x,y)的目的我认为这是一种减少重复的方式,因为我能够继承Actor的属性(this.scene = scene,this.x = x和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++;
};

1 个答案:

答案 0 :(得分:1)

.call()是一种在javascript中调用函数的特殊方法。使用call可以为函数设置不同的范围(也就是说,在函数中使用this时,它将作为call中的第一个参数传递而不是正常该职能的范围)。

在这种情况下,它与Java的super()非常相似,可以调用父类构造函数,因为它完全与Actor的构造函数相同,但是在Spaceship的一个实例上类而不是Actor类的实例。所以,是的,您可以说它已被使用,因此您不需要在Spaceship构造函数中放置使用相同的代码,尽管这是一种过于简单的方式来查看它

在MDN页面上有关于如何使用.call()链接构造函数https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call

的示例
  

示例使用对象的链构造函数的调用

     

您可以对对象使用对链构造函数的调用,类似于Java。   在以下示例中,Product对象的构造函数是   用两个参数定义,名称和价格。另外两个功能食物   和玩具调用产品传递此名称和价格。产品   初始化属性名称和价格,两个专门的功能   定义类别。

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);