2

我是 JavaScript 中的 OO 新手,并试图制作这个简单的画布演示:

var c; // typeof c is the canvas element
function SolarSystem(plane, sun) {

    this.plane = plane; // typeof plane is Canvas Ctxt
    this.sun = sun;

    this.init = function () {
        draw();
    }


    this.render = function () {
        c.height = c.height;
        requestAnimationFrame(this.render);
        this.draw();
    }

    this.draw = function () {
        console.log(1);
    }

}

我想要做的是,为了渲染SolarSystem,我想调用它里面的 render() 。我不能从渲染()调用渲染(),我怎么能不进入Uncaught TypeError: Type error控制台呢?谢谢!

4

3 回答 3

3
this.init = function () {
    draw();
}

draw()应该是this.draw(),否则该函数是通过全局window对象调用的。

于 2013-04-24T00:34:09.293 回答
2

通常在对象中使用的是这条小线:

var self = this;

因为this根据您所在的范围进行更改,self所以很容易引用原始对象。然后,当您需要SolarSystem()对象之外的东西时,您可以使用self.method().

您可能看不到示例中的好处,但是如果/当您开始将作用域应用于您的方法时,您会看到它是如何有用的。例如

function MyObject(){
  var self = this;

  var private = function(){
  };
  this.Public = function(){
    // try it at home:
    // call      `self.private();`
    // then call `this.private();`
  };
}
于 2013-04-24T00:33:37.040 回答
0

好的,正如 Brad Christie 所说,我指的是函数的本地范围,而不是对象 SolarSystem。以下工作完美。再次感谢!

function SolarSystem(plane, sun){

this.plane = plane;
this.sun = sun;

var self = this;

this.init = function(){
    self.draw();
}


this.render = function(){
    c.height = c.height; // reset canvas
    requestAnimationFrame(self.render);
    self.draw();
}

this.draw = function(){
    console.log(1);
}
}
于 2013-04-24T00:40:13.290 回答