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

instantiating an object inside an instance method in javascript

本文关键字:实例化 对象 实例方法 javascript      更新时间:2023-12-12

我正在尝试使用javascript创建一个小游戏,一切都很顺利,直到我必须发射一些东西,我需要实例化一个"子弹"并发射它,但当调用"new bullet()"时,我得到了一个"Unaught 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();

在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运算符。

编辑:阐明了吊装的含义。

下面是发生的事情。

当调用gun.fire();时,局部变量bullet被声明并初始化为"undefined",而表达式的其余部分则被求值。此表达式的求值将查找一个名为bullet的变量,并在局部作用域中找到它,忽略全局作用域中的项目符号变量。

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

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