在我正在关注的教程中,我正在创建一个将继承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++;
};
答案 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);