我正在使用普通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找到它。
答案 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的原因,避免所有这些脆弱和惯例