Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JS OOP外部原型函数调用(范围)_Javascript_Oop_Scope - Fatal编程技术网

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

Javascript JS OOP外部原型函数调用(范围),javascript,oop,scope,Javascript,Oop,Scope,我是OOP新手,我正在编写一个简单的游戏脚本来学习OOP原理 //main game function battleLevel.prototype = { battle:function () { this.obj1 = { enterMonsterMenu: function() { return console.log('enterMonsterMenu'); } }

我是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()方法,但无法正确调用它。我做错了什么?

看起来你没有正确理解概念,至少试着重读一遍

让我们看看在您试图调用“enterMonsterMenu”的行中发生了什么。 这是:

battleLevel.prototype.battle.call(obj1);
battleLevel.prototype
是您首先定义的对象。
battleLevel.prototype.battle
是一个函数,您可以执行它的“call”方法(因为函数也是js中的对象,具有类似“call”的函数)

什么是“函数调用”?它使用给定的
值调用函数。
比如说,

var myObject={name:“Object 1”};
var yourObject={name:“对象2”};
功能测试(){
警报(此名称);
}
test.call(myObject)//警报对象1

调用(你的对象)//alert Object 2
感谢您的回复:),我在这里尝试解决范围问题。我甚至不知道是否有可能从另一个原型方法中调用任何位于战列层内的方法。原型方法?@PawełKwiatkowski你根本不应该从原型中调用这些方法。相反,您需要创建并使用常规对象。例如,
level=newbattlelevel();英雄=新英雄();hero.enterLevel(level)
enterLevel
中,您可以调用level方法
level.doSomethingWithHero(this)
@PawełKwiatkowski,我也不认为在
battle
方法中创建新对象并将其分配给
this
有什么意义。你想达到什么目标?“obj1”的目的是什么?我试图找到任何在原型中调用方法的方法,它没有任何意义。以前的版本是这样的,我无法理解:battleLevel.prototype={this.enterMonsterMenu:function(){alert('enterMonsterMenu');}}@PawełKwiatkowski您是否试图将“enterMonsterMenu”定义为battleLevel.prototype的一种方法?如果应该这样看:
battleLevel.prototype={enterMonsterMenu:function(){alert('enter');}}
,您可以将其称为
battleLevel.prototype.enterMonsterMenu()
。我仍然不确定你是否真的需要这个原型。如果您只有一个战斗级对象,只需执行
battleLevel={enterMonsterMenu:function(){alert('enter');}}
,然后执行
battleLevel.enterMonsterMenue()