通过指向原始对象的指针更改Javascript对象属性?

时间:2014-03-28 22:43:49

标签: javascript pointers object

我遇到了一个我不确定如何解决的错误。我有下面的函数update(),它接受一个对象,然后对它执行逻辑。

     var requestAnimFrame = ( function() {
                 return window.requestAnimationFrame ||
                    window.webkitRequestAnimationFrame ||
                    window.mozRequestAnimationFrame ||
                    window.oRequestAnimationFrame ||
                    window.msRequestAnimationFrame ||
                    function(callback) {
                       window.setTimeout(callback, 10);  
                    };
                })();

     function doAnimation(ballObject) {
        requestAnimFrame(doAnimation);
        update(ballObject);
        console.log( getProperty("ball","top") );
        console.log( getProperty("ball","left") );
     }

 function Ball(id) {
    this.id = id;
    this.xVel = .17;
    this.yVel = .13;
    this.ts;
 }

     function update(ball){

        // do timestamp calculations
        var newBall = ball;
        var ts = Date.now();             
        newBall.ts = newBall.ts || ts;
        var time_elapsed = ts - newBall.ts;
        newBall.ts = ts;            

        // get values from ball
        var ball_y = parseFloat( getProperty(newBall.id,"top").replace ("px", "") ) || 0;
        var ball_x = parseFloat( getProperty(newBall.id,"left").replace("px", "") ) || 0;

        // do other things, such as set new location for the ball's top and
        // left position and etc.
     }

  // Code that starts the entire process
         (function() {
            ball = new Ball("ball");
            doAnimation(ball);
         })();

正如您从上面我的函数的作用中可以看到的那样,我试图将“newBall”对象上的属性“ts”分配给名为“ts”的局部变量所持有的值。但是,当我去做那个赋值时,“newBall”对象的整个值变为局部变量“ts”的值,而不仅仅是“newBall”对象的“ts”属性。我假设这反映了我的语法错误,但我真的没有任何线索?有没有人有任何想法为什么会这样?

我知道从c ++指针开始,您必须在可以访问指针对象的属性之前取消引用指针。我在某种程度上必须做同样的事情吗?

编辑:我在update()函数之前包含了我的类声明,以及管理重复调用以更新的两个函数。

1 个答案:

答案 0 :(得分:0)

问题在于您的doAnimation功能:

function doAnimation(ballObject) {
  requestAnimFrame(doAnimation);
  update(ballObject);
  /* Logging here */
}

requestAnimationFrame再次调用您的函数时,它将不会传递ballObject参数。事实上,它将传递一个高分辨率的时间戳,这是你在update函数上手动(精度较低)得到的。有关requestAnimationFrame工作原理的详细信息,请查看the documentation at Mozilla Developer Network

回到ballObject参数,您需要使用其他方法来维护对它的引用。通常在javascript中,这是通过闭包实现的:

function doAnimation(ballObject) {
  requestAnimFrame(function() {
    doAnimation(ballObject);
  });

  update(ballObject);
  /* Logging here */
}

您的示例的工作版本:http://jsbin.com/nebucedo/2/edit?js,output