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