2017-10-31 9 views
0

私がobj内JavaScriptのブール関数

コード1の方法からブール値にアクセスしようとしている - エラー

var obj = { 
    positionX : 700, 
    radius : 10, 
    checkRight : function(){ 
     if (obj.positionX < (canvas.width - obj.radius)){ 
      return true; 
     } 
    }, 
    moveRight : function(){this.positionX += 5;} 
}; 

var Key = { 
    right : false 
}; 

document.addEventListener("keydown", keyDownHandler, false); 
document.addEventListener("keyup", keyUpHandler, false); 

function keyDownHandler(event) { 
    switch(event.keyCode) { 
     case 39: 
      Key.right = true; 
      break; 
    } 
}; 

function keyUpHandler(event) { 
    switch(event.keyCode) { 
     case 39: 
      Key.right = false; 
      break; 
    } 
}; 

function draw() { 
    drawObj(); 
    if (Key.right && obj.checkRight){ // I've also tried if (Key.right && obj.checkRight==true) 
     obj.moveRight(); 
    } 
}; 

コード2 - 作品が、だらしない

var obj = { 
    positionX : 700, 
    radius : 10, 
    moveRight : function(){this.positionX += 5;} 
}; 

var Key = { 
    right : false 
}; 

document.addEventListener("keydown", keyDownHandler, false); 
document.addEventListener("keyup", keyUpHandler, false); 

function keyDownHandler(event) { 
    switch(event.keyCode) { 
     case 39: 
      Key.right = true; 
      break; 
    } 
}; 

function keyUpHandler(event) { 
    switch(event.keyCode) { 
     case 39: 
      Key.right = false; 
      break; 
    } 
}; 

function draw() { 
    drawObj(); 
    if (Key.right && obj.positionX < (canvas.width - obj.radius)){ 
     obj.moveRight(); 
    } 
}; 

オブジェクトがキャンバスの端に達すると、objが右に移動しなくてはならないという考えがあります。しかし、このコードでは、まったく動かないでしょう。しかし、もし私が 'checkRight'コードを直接draw()if文に入れればうまく動作します。それはobj関数として動作しない理由を知っていますか?

あなたが持っている「コード1」というラベルの付いたセクションで37に
+2

そのため 'obj.checkRight'は、関数である - しかし、あなたはそれを呼び出していない - '() 'を呼び出すに追加それ! 'obj.checkRight()' - 単に 'obj.checkRight'を実行すると関数定義が返されます。つまり、' if(obj.checkRight) 'は常に通過します。 – tymeJV

答えて

0

if (Key.right && obj.checkRight) { 

それは方法のtruthiness

if (Key.right && obj.checkRight()) { 

旧テストする必要がありますし、以来trueに強制変換される時期関数はJSで真実です。後者はメソッドを呼び出し、条件式の戻り値を使用します。条件が満たされない場合の条件がtrueある場合にのみ返すので

+0

私はこれをやってみましたが、objがまったく動かないようにしました – Eishknaar

+0

これは正しいことが分かりましたが、の代わりに>を使って 'checkRight'関数をコーディングしました。ありがとう! – Eishknaar

0

また、あなたのcheckRight()方法はを返すことはありません。

ifブロックがある条件または条件セットに基づいてブール値を返すだけの場合は、より良いパターンが採用されます。この代わりに:

checkRight: function() { 
    if (obj.positionX < (canvas.width - obj.radius)){ 
     return true; 
    } else { 
     return false; 
    } 
}, 

ただ、条件自体を返す:

checkRight: function() { 
    return obj.positionX < (canvas.width - obj.radius); 
}, 
+0

ええ、私はこのアプローチを最初に試みましたが、今の問題と同じでした – Eishknaar