2016-06-13 18 views
3

私はOOPを初めて使いました。私はOOPの原則を学ぶための簡単なゲームスクリプトを書いています。JS OOPプロトタイプ関数呼び出しの外(スコープ)

//main game function 
battleLevel.prototype = 
{ 

    battle:function() {  
     this.obj1 = { 
      enterMonsterMenu: function() { 
      return console.log('enterMonsterMenu'); 
      } 
     };  
    },  

} /* end OOP prototype */ 



//external contructor 
var Hero = function (warpX, warpY, game, name, life, mana, speed) { 
    //some code 
}; 

Hero.prototype.monsterSelectUp = function() { 
    console.log('monsterSelectUp'); 
    //this.enterMonsterMenu(); 
    battleLevel.prototype.battle.call(obj1); 
}; 

私はmonsterSelectUp()を呼び出すことによってenterMonsterMenu()メソッドにアクセスしたいが、私はそれを正しく呼び出すことはできません。私が間違っていることは何ですか?

答えて

1

あなたはコンセプトを正しく理解していないようですが、少なくともthis short introを再読み込みしてみてください。

「enterMonsterMenu」と呼ばれる行で何が起きているのかを見てみましょう。 ここにある:

battleLevel.prototype.battle.call(obj1); 

battleLevel.prototypeは、あなたが最初に定義されたオブジェクトです。 battleLevel.prototype.battleは関数であり、関数は "呼び出し"メソッドを実行します(関数もjsのオブジェクトであり、 "呼び出し"のような機能を持つため)。

"function.call"とは何かmethod?与えられた関数thisを呼び出します。たとえば 、あなたのコードで

var myObject = { name: "Object 1" }; 
 
var yourObject = { name: "Object 2" }; 
 

 
function test() { 
 
    alert(this.name); 
 
} 
 

 
test.call(myObject); //alert Object 1 
 
test.call(yourObject); //alert Object 2

、あなたはbattleLevel.prototype.battleを呼び出そうとthisとしてobj1を渡しています。

しかし、そのコードポイントにはobj1変数が定義されていないので、battleメソッドを定義されていない変数で呼び出すだけです。

さらに、定義済みの変数を渡しても、とにかくenterMonsterMenu関数を呼び出すことはありません。あなたの方法は、唯一のthisオブジェクトにobj1プロパティを追加するので:

battleLevel = {} 
 
battleLevel.prototype = 
 
{ 
 

 
    battle:function() {  
 
     this.obj1 = { 
 
      enterMonsterMenu: function() { 
 
      alert('enterMonsterMenu'); 
 
      } 
 
     };  
 
    },  
 

 
} 
 

 

 
var myThis = {"property": "value"}; 
 
alert(JSON.stringify(myThis)); // {"property": "value"}; 
 
// This call will add "obj1" property to myThis 
 
battleLevel.prototype.battle.call(myThis); 
 
alert(JSON.stringify(myThis)); // {"property": "value", "obj1": {}}; 
 
// now call the 'enterMonsterMenu' 
 
myThis.obj1.enterMonsterMenu();

あなたが実際にあなたのenterMonsterMenuを呼び出すことができますどのように上に見ることができますが、正直に言うと、私は物事を行うにはポイントを参照してくださいませんこのような。そして、私が言ったように、おそらくコンセプトの学習にもっと時間を費やす必要があります。

+0

あなたの返信ありがとう:)、私はここで範囲の問題を解決しようとしています。 battleLevel.prototypeの中にあるメソッドを別のプロトタイプメソッドから呼び出すことが可能なのかどうか分かりませんか? –

+1

@PawełKwiatkowskiでは、プロトタイプからメソッドを呼び出すべきではありません。代わりに、通常のオブジェクトを作成して使用する必要があります。たとえば、 'level = new BattleLevel();ヒーロー=新しいヒーロー(); hero.enterLevel(レベル) 'と' enterLevel'の内部でレベルメソッド 'level.doSomethingWithHero(this)'を呼び出すことができます。 –

+0

@PawełKwiatkowskiまた、私は 'battle'メソッドの中で新しいオブジェクトを作成し、それを' this'に割り当てるという点は見ません。あなたは何を達成しようとしていますか? "obj1"の目的は何ですか? –

関連する問題