javascript - JS OOP 外部原型(prototype)函数调用(作用域)

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

最佳答案

看起来你没有理解正确的概念,至少尝试重新阅读 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变量,所以你只需要用 undefined variable 调用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,但老实说,我认为这样做没有意义。而且,正如我所说,您可能需要花更多时间来学习这些概念。

关于javascript - JS OOP 外部原型(prototype)函数调用(作用域),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37785042/

相关文章:

javascript - 为什么在 vue 组件上输入另一个输入时输入文件的值丢失?

javascript json 数据脚本无法工作

c++ - 我的设计几乎是为 OOP 而尖叫。我应该改变我的设计还是改变我的编程语言?

javascript - 关于JavaScript中 "this"的问题

python:从外部代码导入 numpy 作为 np 在我自己的用户定义模块中丢失

javascript - 如何使用 getElementsByClass 更改当前编辑的类?

javascript - 如何填充半圆的上部?

c++/面向对象快速复习?

c++ - 类继承 : static members and virtual methods

Python:定义类变量时可以访问哪些范围?