Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/471.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从另一个调用javascript原型方法_Javascript_Methods_Prototype - Fatal编程技术网

从另一个调用javascript原型方法

从另一个调用javascript原型方法,javascript,methods,prototype,Javascript,Methods,Prototype,这是另一个问题()的重复。然而,被接受的答案对我不起作用,请帮我找到我的错误 我有一个包含多个原型方法的javascript类,但由于某些原因,我无法从一个原型方法调用另一个原型方法 var Particles = function() {}; Particles.prototype.physicsStep = function() { this.computeForces(); // error in Chrome this.integrationStep(); // err

这是另一个问题()的重复。然而,被接受的答案对我不起作用,请帮我找到我的错误

我有一个包含多个原型方法的javascript类,但由于某些原因,我无法从一个原型方法调用另一个原型方法

var Particles = function() {};

Particles.prototype.physicsStep = function() {
    this.computeForces(); // error in Chrome
    this.integrationStep(); // error in Chrome
}

Particles.prototype.computeForces = function() {
    // do some stuff
}

Particles.prototype.integrationStep = function() {
   // do some stuff
}
Chrome总是抛出错误“UncaughtTypeError:this.computeForces不是函数”。我一定完全没有抓住要点。任何帮助都将不胜感激

particles.js


还有一些其他文件,但我认为错误一定在这两个文件中的一个。感谢您的帮助。

使用您当前的代码,您可以执行以下操作:

var p = new Particles();
p.physicsStep();
然后,在
physicstep()
内部,它将适当地执行
this.computeForces()
this.integrationStep()
this
将是指向在上面第一行代码中创建的
p
对象的指针

this
的值由方法/函数的调用方式设置,因此如果您对
this
的值有问题,那么问题可能不在于方法本身,而在于如何调用它

如果您需要代码的这一部分的帮助,那么可以将该代码添加到您的问题中,让我们来看看

工作示例:


是的,您是正确的。一个问题与如何使用setInterval有关

您可以更改此设置:

window.setInterval(particles.physicsStep, 1000 * particles.dt);
为此:

window.setInterval(particles.physicsStep.bind(particles), 1000 * particles.dt);
当您将
particles.physicstep
作为一个函数引用传递给另一个函数时,
particles
部分将丢失。传递的只是对
physicstep
方法的引用,因此当setInterval调用它时,它将作为普通函数调用,而不是作为对象的方法调用

这是Javascript中的一个常见错误,有几种方法可以解决这个问题。我在上面演示了如何使用
.bind()
。您还可以像这样创建自己的小存根函数(本质上就是
.bind()
为您所做的):

window.setInterval(function() {
    particles.physicsStep();
}, 1000 * particles.dt);
这确保对正确的对象调用
physicStep()

仅供参考,此处有类似问题和答案:

更改此行:

window.setInterval(particles.physicsStep, 1000 * particles.dt);

将函数方法引用而不是对象本身传递到:

window.setInterval(function(){particles.physicsStep()}, 1000 * particles.dt);

或者这个(当作为引用传递时,
粒子
对象被传递到上下文):


它会起作用(或者至少你不会再犯这个错误,整个过程是否有效是另一个问题)。

如何创建实例,如何调用方法?这是由调用设置的。在另一个文件中,我使用“particles=newparticles();”然后是“particles.physicstep()”我没有收到错误。编辑:发布您的实际代码(相关片段),包括声明和调用的文件
Particles
。@JaredFarrish最好是一个Plunker示例,其中OP可以显示如何包含单独的文件(Plunker支持多个源文件)。这里传递的是函数方法引用,而不是对象本身。把它改为,它就会工作(或者至少你不会再犯那个错误了,整个事情是否有效是另一个问题)。谢谢。在阅读了该链接和其他一些链接后,我认为问题与
窗口的事件处理程序的设置方式有关。setInterval
正在设置
,但我对机制的理解不够透彻,无法找到解决方案。我真的很感谢大家的帮助。@applecollider-是的,关于
setInterval()
你是正确的。既然您已经公开了代码的这一部分,那么看看我在回答中添加了什么。
window.setInterval(particles.physicsStep, 1000 * particles.dt);
window.setInterval(function(){particles.physicsStep()}, 1000 * particles.dt);
window.setInterval(particles.physicsStep.bind(p), 1000);