简单javascript游戏:构造函数或条件运算符导致对象创建错误

简单javascript游戏:构造函数或条件运算符导致对象创建错误,javascript,object,constructor,conditional-statements,Javascript,Object,Constructor,Conditional Statements,我对java相当陌生,我一直在慢慢地构建一个游戏。我知道有不同的方法来编写对象,但经过推荐后,我构建了如下模型: function object(x,y,z){ var object={ a:x, b:y, c:z }; function doSomething(){ ... } return object; } 在我让我的“玩家”射门之前,一切都很顺利。螺栓是对象,每个新创建的螺栓都存储在一个数组中。这是: va

我对java相当陌生,我一直在慢慢地构建一个游戏。我知道有不同的方法来编写对象,但经过推荐后,我构建了如下模型:

function object(x,y,z){
    var object={
    a:x,
    b:y,
    c:z
    };
    function doSomething(){
        ...
    }
    return object;
}
在我让我的“玩家”射门之前,一切都很顺利。螺栓是对象,每个新创建的螺栓都存储在一个数组中。这是:

var playerBolts=new Array();
这是在“玩家”对象射击时在其内部调用的方法:

function shootBolt(){
    playerBolts.push(bolt(player.playerNum,player.facingLeft,player.x,player.y));
}
门闩是从球员的当前位置射出的,取决于他所面对的方向,门闩显然会朝这个方向移动。为了让螺栓知道它必须移动哪个,我在螺栓的对象构造函数中有一个布尔值,名为“facing”(上面的player.facingLeft)。当我在三元运算符中使用该布尔值给出方向速度时,它总是给我一个错误:“ReferenceError:facingLeft未定义”

这是创建的螺栓对象:

function bolt(fromPlayer,facing,playerX,playerY){
    var bolt={
        playerNum:fromPlayer,
        damage:10,
        facingLeft:facing, //The direction at which the bolt moves, if left, true
        x:playerX, //The x position of the bolt
        y:playerY, //The y position of the bolt
        xSpeed:facingLeft ? -3 : 3, //The horizontal speed at which the bolt is moving
        ySpeed:0, //The vertical speed at which the bolt is moving
        W:3, //The width of the bolt's model
        H:3, //The height of the bolt's model
        color:"red", //The color of the bolt's model
        update:update,
        draw:draw
    };
    function update(){ 
        ...
    }       
    function draw(){
        ...
    }
    return bolt;
}
如果我删除三元运算符并将xSpeed设置为预定义值,那么构造函数中的所有其他变量似乎都可以正常传递。所以我真的想知道我做错了什么。。。我尝试执行if/else语句,但得到的结果是:“SyntaxError:missing:after property id”

我是否必须将所有对象更改为不同的模型,或者是否有我看不到的东西?如果不清楚,我可以提供更多信息或代码


谢谢你?!:P

更换

facingLeft-3:3
面朝-3:3,因为您无法引用尚未创建的对象的属性(即“facingLeft”)

另请参见此

1)您不能在构建对象时引用该对象。如果在计算属性值时使用“this”,则将使用当前上下文,而不是新对象:

function someFunc() {
    var functionThis = this;

     var aNewObject = {
                        a : 3,
                        b : this.a *2   // nAn : this.a == functionThis.a                                           
                        }

     // this will be working :
     aNewObject.b = aNewObject.a * 2;
   }
所以当你提到'this.face'时,它会给出:undefined,所以三元运算符 将始终切换到falsy案件

在您的情况下,解决方案很简单:使用facingLeft对象属性,而不是尝试获取facingLeft对象属性:

    xSpeed:facing ? -3 : 3,

2) 如果你正在使用大量螺栓,请考虑在原型上设置方法,以便更快地创建和更少地创建垃圾。

还有就是这样的神圣大坝……猜到凌晨4点,事情开始失去透视xD感谢这一点和链接@文森特派尔:我试过“真”和“假”,效果很好。你面临的问题是什么?我可能说得太早了。实际上,我现在可以看到一个螺栓而不是错误消息,它不会响应三元运算符,并且无论facingLeft是否为真,它总是朝同一方向移动:(@ExpertSystem:you没有测试正确的物品属性:这里的问题是xspeed,无论是向右还是向左都是一样的。@AlexanderWeihmayer:对不起,我更新了我的答案和简短的演示。Soooo yep,很好地解决了这个问题,谢谢,我不知道:)我基本上也做了同样的事情,但是在外面(紧接着)var bolt={}我添加了:bolt.xSpeed=bolt.facingLeft?-3:3;但是对于你的2)我不太确定那是什么,或者你是如何做到的……谷歌上有没有一个术语或者一篇文章我可以看一下,以获取相关信息?