2016-12-15 67 views
1

在本教程中,我創建了一個將繼承Actor超類的宇宙飛船。當創建飛船的構造函數,我調用使用Actor.call(此,場景,X,Y)的演員構造調用超類構造函數的HTML5遊戲

誰能告訴我Actor.call(此,場景,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

你的問題只是「什麼是構造函數」? – meagar

+0

我的問題是 - 在Spaceship構造函數中您有任何Java(或任何類似的面向對象的語言)體驗的Actor.call(this,scene,x,y) – stckpete

+0

的用途是什麼?另外,你知道原型繼承如何在JavaScript中工作嗎? – valepu

回答

1

.call()是一種在javascript中調用函數的特殊方法。使用call可以爲函數設置不同的作用域(即,在函數中使用this時,它將作爲call中的第一個參數傳遞,而不是該函數的正常作用域)。

在這種情況下,它非常類似於Java的super()來調用父類的構造函數,因爲它完全是Actor的構造函數的作用,而是在Spaceship類的實例上,而不是Actor類的實例。所以是的,你可以說它已經被使用了,所以你不需要把同樣的代碼放在Spaceship構造函數中的Actor構造函數中,儘管這是一種簡單的方式來看它

在MDN頁面上有一個關於如何使用.call()到鏈構造https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call

實例使用調用鏈構造一個對象

您可以使用調用鏈構造一個對象,類似於Java。 在以下示例中,產品對象的構造函數是 ,它使用兩個參數name和price定義。其他兩個功能食品 和玩具調用產品傳遞此名稱和價格。產品 初始化屬性名稱和價格,兩個專業功能 定義類別。

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); 
相關問題