【问题标题】:Access an object from an other class从其他类访问对象
【发布时间】:2018-09-09 10:23:25
【问题描述】:

我有一个 JavaScript 函数来创建一个宇宙飞船对象。在我的函数 spaceship_build() 中,我用 pixijs 绘制我的船。另外,我创建了一个对象“spaceship_object”给他们对象一些属性,如能量或船级。现在我遇到了问题,我无法访问其他类中的 spaceship_object 属性。如何从 spaceship_build 函数访问对象属性?

我的解决方案是,我将函数 fly_left 包含在函数 spaceship_build(闭包)中。但这并不是很好,因为我还有其他必须访问该对象的函数。我的想法是返回对象,但我不知道该怎么做。

$("#b_schiff_beantragen").click(function() { 
if (!spaceship_object) { 
spaceship_object = spaceship_build(); 

} 
spaceship_draw(spaceship_object); 
$(".energie").css("visibility", "visible"); 
$("#b_schiff_zerstoeren").css("visibility", "visible"); 
$("#energiewertdiv").css("visibility", "visible"); 
});

  $("#b_nav_li").click(function() {

    flyleft(spaceship_object);
    console.log("Linksflug");
    console.log(spaceship_object.energy);
}); 



function flyleft(spaceship_object) {
    if (ship_energy(spaceship_object.energy) == true) {
    spaceship.x -= 50;  

    spaceship_object.energy -= 1;
    ship_energy(spaceship_object.energy);
    }
    mapborder850();
}

【问题讨论】:

    标签: javascript jquery html pixi.js


    【解决方案1】:

    让 fly_left 接受一个宇宙飞船对象作为参数,如下所示:

    function fly_left(spaceship_object) {
        if (ship_energy(spaceship_object.energy) == true) {
            spaceship.x -= 50;  
            spaceship_object.energy -= 1;
            ship_energy(spaceship_object.energy);
        }
        mapborder850();
    }
    

    然后像这样传递spaceship_build创建的对象:

    var spaceship_object = spaceship_build();
    fly_left(spaceship_object)
    

    确保在需要调用 fly_left 时保留对该飞船对象的引用

    spaceship_build 返回一个对象,您可以将其存储在变量中,就像我在上面向您展示的那样。使需要该对象的所有函数都接受一个参数(在您的情况下是您创建的 spaceship_object)

    更新 您需要将您的 spaceship_object 存储在任何事件处理程序(如 .click())之外,如下所示:

    function flyleft(spaceship_object) {
        if (ship_energy(spaceship_object.energy) == true) {
            spaceship.x -= 50;
            spaceship_object.energy -= 1;
            ship_energy(spaceship_object.energy);
        }
        mapborder850();
    }
    
    var spaceship_object = spaceship_build();
    
    $("#b_left").click( function() {
        flyleft(spaceship_object);
        console.log(spaceship_object.energy);
    });
    

    您无法访问原始飞船的原因(除了click 处理程序上的错误语法)是每次单击#b 按钮时都创建了一个新对象实例(因此原始飞船丢失了)

    或者,如果您想在点击事件期间初始化宇宙飞船但有全局引用,请尝试:

    var spaceship_object = null;
    $("#b_left").click( function() {
        if(!spaceship_object) spaceship_object = build_spaceship();
        flyleft(spaceship_object);
        console.log(spaceship_object.energy);
    });
    

    【讨论】:

    • 那不起作用,因为我之间有一个 jquery .click 处理程序。 var spaceship_object = spaceship_build(); $("#b_left").click(spaceship_object , function() { flyleft(spaceship_build()); console.log(spaceship_object.energy); }); function flyleft(spaceship_object) { if (ship_energy(spaceship_object.energy) == true) { spaceship.x -= 50; spaceship_object.energy -= 1; ship_energy(spaceship_object.energy); } mapborder850(); }
    • @Whiteheat 我会在几分钟内更新我的答案
    • 有了这个解决方案,在我按下按钮之前,宇宙飞船已经建造完成。该变量通过初始化自动启动 spaceship_build() 函数。这就是为什么我试图将变量放在 .click 函数中的原因。
    • 好的,然后在点击事件中移动宇宙飞船初始化
    • @Whiteheat 让我知道我的新解决方案是否对您有帮助
    猜你喜欢
    • 1970-01-01
    • 2012-12-14
    • 1970-01-01
    • 2013-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多