JS OOP外部原型函数调用(范围)

时间:2016-06-13 08:31:17

标签: javascript oop scope

我是OOP的新手,我正在编写一个简单的游戏脚本来学习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 个答案:

答案 0 :(得分:1)

看起来您没有正确理解这些概念,尝试至少重新阅读this short intro

让我们试着看看您试图呼叫的行中发生了什么" enterMonsterMenu"。 这是:

battleLevel.prototype.battle.call(obj1);

battleLevel.prototype是您首先定义的对象。 battleLevel.prototype.battle是一个功能,您执行它"" call"方法(因为函数也是js中的对象,并且具有类似" call")的函数。

" 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并将obj1作为this传递。

但是在那个代码点没有定义obj1变量,所以你只需用未定义的变量调用battle方法。

此外,即使您传递了已定义的变量,也无论如何都不会调用enterMonsterMenu函数。因为您的方法只将obj1属性添加到this对象:



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,但说实话,我认为做这样的事情毫无意义。而且,正如我所说,你可能需要花更多的时间来学习这些概念。