2

我正在使用纯 Javascript(无 Coffescript)的 Spine.js。
我正在使用文档中描述的语法来调用父类方法。

具体来说:this.constructor.__super__.someFunction.apply(this, arguments) 

这对于调用它的直接父类的直接子类来说很好。但是加上一个孙子班,一切都乱套了。在孙子类的实例上调用该方法会导致无限循环。我有一个jsFiddle,它通过实现此处显示的类层次结构来演示这一点:

MyObjClass(实现方法 sayHi())
^
|
My2ndObjClass(方法 sayHi() 调用超类)
^
|
My3rdObjClass

当在 My3rdObjClass 的实例上调用 sayHi() 时,您会得到一个无限循环(Chrome 控制台报告最大堆栈错误)。

我的猜测是,当 sayHi() 在 My3rdObj 上运行时,它自然会运行父类实现(因此,My2ndObjClass 的 sayHi() 会执行)。My2ndObjClass 的 sayHi() 然后将super解析为 My2ndObjClass 而不是 MyObjClass (如我所料),因此对 super 的调用现在变成了递归调用,然后我们就走了…… StackOverflow ;)

那么,我做错了什么,还是这是 Spine 的限制?我怀疑有一些聪明的方法可以解决这个问题,但我没有通过谷歌或 RTFM 找到它。

4

1 回答 1

0

两件事:“这”不是你想象的那样。“this”的作用域不遵循传统的语言结构,所以你需要在你想要的闭包中引用特定的变量。在这种情况下,“my2ndObjClass”。

其次,由于您使用的是“包含”,因此您的方法是在实例上定义的,而不是在类上。在原型/对象的咖啡脚本/javascript 使用中,您要查找的东西是否在构造函数中,对象本身。所以不要看构造函数的super,直接看对象的。

所以,你的定义

  my2ndObjClass.include({
    sayHi: function() {
        this.constructor.__super__.sayHi.apply(this,arguments);
    }
  });

变成

my2ndObjClass.include({
    sayHi: function() {
        my2ndObjClass.__super__.sayHi.apply(this,arguments);
    }
  });

它有效。

恕我直言,这些都是使用咖啡脚本的原因,以避免所有这些脆弱和惯例

于 2012-06-13T13:29:53.030 回答