在Prototype类中定义递归函数?

时间:2010-04-19 15:28:03

标签: javascript prototypejs

我正在尝试创建一个图像旋转器类,它循环遍历无序列表中的任意数量的图像。是否可以在类声明中定义递归函数? E.g:

var Rotator = Class.create() {
 initialize: function() {
  do something...

  this.rotate();
 }

 rotate: function() {
   do something...

   this.rotate()
 }
}

它当前抛出错误,指出“this.rotate()不是函数”

2 个答案:

答案 0 :(得分:5)

答案:

你在那里应该工作(除了我认为的几个拼写错误;下面),因为你正在从属性访问该功能。请注意,这意味着如果您正在使用继承,则会重新输入最顶层(大多数子类)rotate函数,因为这是分配给实例rotate属性的那个。 / p>

你说这是this.rotate不是函数。你怎么称呼它?因为如果你做的是这样的话:

var r = new Rotator();
setInterval(r.rotate, 1000);

或(rotate内):

setInterval(this.rotate, 1000);

...这不会起作用,因为你只是将函数(而不是它的上下文)传递给setInterval。这可行:

var r = new Rotator();
setInterval(r.rotate.bind(r), 1000);

或(rotate内):

setInterval(this.rotate.bind(this), 1000);

使用Function#bind创建一个将设置正确上下文的函数。有关this post中Javascript中的函数与方法的更多信息。

错别字:

var Rotator = Class.create() {
...
}

应该是

var Rotator = Class.create({
...
});

您还需要在您正在使用的对象文字符号中的两个函数之间使用逗号。所以那些清理过来的是:

var Rotator = Class.create({ // <= open brace *within* the parens

    initialize: function() {
        // do something...

        this.rotate();
    },                       // <= missing comma was here

    rotate: function() {
        // do something...

        this.rotate();
    }

    return pubs;
});                          // <= close the braces and parens here

命名函数(以​​及错字避免和私有函数):

FWIW,您可以避免拼写错误,例如省略函数之间的逗号,获得具有real names的函数的所有好处(而不是绑定到属性的匿名函数)< em> plus 获取私有类的功能(如果这对你有用)。这是我大多使用的成语(虽然我使用帮助器使语法更清晰;下面是原始Prototype):

var Rotator = Class.create((function(){
    var pubs = {};

    pubs.initialize = initialize;
    function initialize() {
        // do something...

        this.rotate();
    }

    pubs.rotate = rotate;
    function rotate() {
        // do something...

        this.rotate();
    }

    return pubs;
})());

有关该成语的更多信息(以及为何无法合并上述pubsfunction链接)the linked post

答案 1 :(得分:0)

是的,只要您确信“这个”是正确的,这是可能的。还有其他方法,但它们有不幸的缺点。您可以为函数指定名称(即,在function关键字之后),但这可能会导致IE出现问题。你也可以通过arguments.callee来引用一个函数,但是我已经知道这有很奇怪的性能问题,加上整个arguments的东西都有点被弃用了,因为它很奇怪。