Spine.js:调用super方法会导致无限循环

时间:2012-06-11 16:25:58

标签: spine.js

我正在使用普通Javascript的Spine.js(没有Coffescript) 我正在使用documentation中描述的语法来调用父类方法。

Specifically:  this.constructor.__super__.someFunction.apply(this, arguments) 

这适用于直接子类调用它的直接父类。但是加上一个盛大的班级,所有的地狱都破裂了。在grand-child类的实例上调用该方法会导致无限循环。我有jsFiddle通过实现此处显示的类层次结构来演示这一点:

MyObjClass (implements method sayHi())
^
|
My2ndObjClass (method sayHi() calls superclass)
^
|
My3rdObjClass 

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

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

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

1 个答案:

答案 0 :(得分:0)

2件事:“这个”不是你想象的那样。 “this”的范围不遵循传统的语言结构,因此您需要在所需的闭包中引用特定的变量。在这种情况下,“my2ndObjClass”。

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

所以,你的定义

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

成为

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

它有效。

恕我直言,这些都是使用coffeescript的原因,避免所有这些脆弱和惯例