我有一个看起来像这样的“班级”:export function IBXMReplay() { var onRow = function(){console.log("not right")}; ....}稍后,在这样的函数中调用它:var seqRow = function() { onRow(); ....}Web音频getAudio的回调实际上调用了此函数。我这样构造对象:var replay = new IBXMReplay();replay.onRow = function(){console.log("Right")};但是,在调用onRow()时,它始终显示"not right."我究竟做错了什么???我尝试创建一个setter函数,但是那也不起作用。 最佳答案 问题是onRow函数被定义为IBXMReplay本地作用域中的变量,并且我假设seqRow函数也位于IBXMReplay内部。局部作用域变量不能直接访问,也不能从外部进行修改。为此,您需要使onRow函数成为IBXMReplay对象的属性(在JS函数中也是对象):export function IBXMReplay() { this.onRow = function(){console.log("not right")}; ....}或者更好的是,将其存储在原型中:var IBXMReplay = function IBXMReplay() { ....}IBXMReplay.prototype.onRow = function(){console.log("not right")};export IBXMReplay无论哪种方式,您都可以稍后执行:var replay = new IBXMReplay();replay.onRow = function(){console.log("Right")};它应该按预期工作。现在,对此进行一些解释。假设您有100个IBXMReplay'class'实例。将其存储为对象属性与原型属性之间的区别非常细微但很重要:对象属性将方法存储为this.onRow意味着在内存中将有100个副本。如果以后使用replay.onRow = something编辑它,它将完全替换为该特定实例。在执行该实例时,执行delete replay.onRow之类的操作不会恢复原始功能,而是抛出“未定义的不是功能”错误。原型属性相反,将函数存储在对象的原型中将意味着所有实例都将仅引用onRow的单个副本。使用replay.onRow = something编辑实例时,底层原型onRow只会被同名的对象属性遮盖,因此IBXMReplay类内部的任何调用都将引用覆盖函数。删除实例属性delete replay.onRow将“发现”原始功能。这就是JavaScript的工作方式,被称为原型链。每当执行foo.bar时,都会直接在bar对象中搜索foo属性,但是如果找不到,则会在foo的原型中搜索该属性,然后在该原型的原型中进行搜索,依此类推,直到达到,没有原型。 08-04 18:59