在javascript中实例化实例方法中的对象

时间:2013-11-28 21:41:32

标签: javascript oop

我试图使用javascript创建一个小游戏,一切顺利,直到我必须解雇一些东西,我需要实例化一个“子弹”并解雇它,但是当调用“new bullet()”时,我得到了一个“未捕获的TypeError:undefined不是函数“。 如何在另一个对象方法中实例化一个对象?

这就是我所做的

function bullet(){
    //here it would be state for the bullet, like x and y and thigs
    console.log("bullet created");
}

function gun(){
    //state for the gun, amount of bullets and sort
    console.log("gun created");

    this.fire = function(){
        //here we instantiate a bullet and fire it
        console.log("begin fire");
        var bullet = new bullet();
        console.log("created bullet to fire");
    }
}

var gun = new gun();

gun.fire();

2 个答案:

答案 0 :(得分:2)

在javascript中你的变量被提升了。要清楚这意味着什么,编译器会将您编写的代码视为您编写的代码:

function gun(){
    //state for the gun, amount of bullets and sort
    console.log("gun created");
    this.fire = function(){
        var bullet;
        //here we instantiate a bullet and fire it
        console.log("begin fire");
        bullet = new bullet();
        console.log("created bullet to fire");
    }
}

因此在JS中,所有变量声明都会移动到当前函数作用域的顶部。请注意,在所有编程语言中都不是这样。在某些语言中,您可以使用上述内容并bullet该变量将成功替换bullet函数。

最佳解决方案是为您的变量命名。

function gun(){
    //state for the gun, amount of bullets and sort
    console.log("gun created");
    this.fire = function(){
        //here we instantiate a bullet and fire it
        console.log("begin fire");
        var mybullet = new bullet();
        console.log("created bullet to fire");
    }
}

另外,由匈牙利人提出,我认为你误解了JS中的new运算符。

编辑:明确提升的含义。

答案 1 :(得分:0)

这是正在发生的事情。

当您调用gun.fire();时,声明局部变量bullet并将其初始化为'undefined',同时计算表达式的其余部分。对此表达式的求值将查找名为bullet的变量,并在本地范围内查找它,忽略全局范围中的bullet变量。

这教会了我一些关于javascript的新知识,变量声明不是原子的。

要解决此问题,请将fire方法中的bullet变量重命名为firedBullet。