0

我正在尝试使用 JavaScript 和 Three.js 实现一些面向对象的编程。

我开始用一个类封装场景,如下所示,我update在类中有动画的功能。这很好用,但我想要另一个带有控件的类。

该类Controls还有一个更新函数,应该在场景的每个滴答声中调用。所以我创建了一个数组,其中包含指向所有可能需要调用的更新函数的函数指针Scene.update

比如这样:

Scene = function() {
     ... // scene init etc.
     this.update_f = []; // My array of function pointers

     this.AddToUpdate = function(f) {
         this.update_f.push(f); // add function pointer
     };

     this.Animate = function() {
          requestAnimationFrame(this.Animate.bind(this));
          this.renderer.render(this.scene, this.camera);
          this.Update();
     };

     this.Update = function() {
       for(var i = 0; i < this.update_f.length; i++) {
           this.update_f[i]();
        }
     };
};

还有我的 Controls 类的一些伪代码:

Controls = function() {
     this.obj = new THREE.Object3D();
     ... // do stuff with obj
     this.update = function() {
          console.log(this.obj);
     }
};

这是我初始化所有内容的主要内容:

 var scene = new Scene();
 var controls = new Controls();
 scene.AddToUpdate(controls.update()); // add function pointer
 scene.Animate();

现在到实际问题。当通过数组 ( )scene.update()调用函数时,它会被调用,但实例化的对象似乎不是对象(在 main 中实例化为控件),因为它告诉我“未定义”。controls.update()scene.update_fconsole.log(this.obj)

那么我在这里做错了什么?请给我一些关于这些事情的最佳实践的提示。我不想将所有内容都添加到 Scene 类,因为如果添加更多内容,它可能会变得很大。我只想将其他更新功能插入到Scene.update.

4

1 回答 1

0

这里有多个错误。

Controls = function() {
     this.obj = new THREE.Object3D();
     ... // do stuff with obj
     this.update() {
          console.log(this.obj);
    }
};

您没有将功能分配给Controls. 怎么样

this.update = function() {
    console.log(this.obj);
};

在您的 main 中,您执行更新函数并将其返回值作为参数分配给AddToUpdate

var scene = new Scene();
var controls = new Controls();
scene.AddToUpdate(controls.update);
scene.Animate();

所以如果你想传入函数指针,只需去掉括号即可。

请注意,如果您将对象的函数传递给其他对象,this则将是您将函数传递给的对象。

于 2013-03-27T07:48:00.627 回答