2016-12-15 14 views
1

私は次のチュートリアルで、俳優のスーパークラスから継承する宇宙船を作成しています。宇宙船のコンストラクタを作成するときに、私は誰が私に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

私の質問は - 宇宙船のコンストラクタでは、Actor.call(this、scene、x、y)の目的は何ですか? – stckpete

+0

Java(またはそれに類するオブジェクト指向言語)の経験はありますか?また、プロトタイプの継承がjavascriptでどのように機能するか知っていますか? – valepu

答えて

1

.call()は、javascriptで関数を呼び出す特別な方法です。 callを使用すると、関数に異なるスコープを設定できます(つまり、関数内でthisを使用すると、その関数の通常のスコープではなくcallに最初のパラメータとして渡されます)。それは俳優のコンストラクタはありませんが、スペースシップクラスのインスタンスではなく、俳優のクラスのインスタンスでまさにないので

このケースでは、親クラスのコンストラクタを呼び出すためにJavaのsuper()と非常によく似ています。したがって、Spaceshipコンストラクタ内でActorコンストラクタ内で使用されているのと同じコードを使用する必要はないので、使用していると言えるかもしれません。

MDNページには、オブジェクト

用チェーンのコンストラクタへの呼び出しを使用して.call()

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/callチェーンのコンストラクタに例を使用するためには、Javaに似たオブジェクトのための連鎖コンストラクタへの呼び出しを使用することができます。 次の例では、Productオブジェクトのコンストラクタは、nameとpriceの2つのパラメータで定義された です。他の2つの関数Food とToyはこれと名前と価格を渡す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); 
関連する問題