我试图使用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();
答案 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。