在Prototype类中定义递归函数?

3 javascript prototypejs

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

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

  this.rotate();
 }

 rotate: function() {
   do something...

   this.rotate()
 }
}
Run Code Online (Sandbox Code Playgroud)

它当前抛出一个错误,指出"this.rotate()不是一个函数"

T.J*_*der 5

回答:

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

你说它说这this.rotate不是一个功能.你怎么称呼它?因为如果你做这样的事情:

var r = new Rotator();
setInterval(r.rotate, 1000);
Run Code Online (Sandbox Code Playgroud)

或(内rotate):

setInterval(this.rotate, 1000);
Run Code Online (Sandbox Code Playgroud)

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

var r = new Rotator();
setInterval(r.rotate.bind(r), 1000);
Run Code Online (Sandbox Code Playgroud)

或(内rotate):

setInterval(this.rotate.bind(this), 1000);
Run Code Online (Sandbox Code Playgroud)

这使用Function#bind来创建一个将设置正确上下文的函数.有关此帖子中Javascript中的函数与方法的更多信息.

错别字:

var Rotator = Class.create() {
...
}
Run Code Online (Sandbox Code Playgroud)

应该

var Rotator = Class.create({
...
});
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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

FWIW,你可以避免拼写错误,比如在函数之间省略逗号,可以获得具有真实姓名的函数的所有好处(而不是绑定到属性的匿名函数)以及获取私有类的函数(如果这对你有用) .这是我主要使用的成语(虽然我使用帮助器使语法更清晰;下面是原始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;
})());
Run Code Online (Sandbox Code Playgroud)

更多关于这个成语(以及为什么你不能将上面pubsfunction上面的链接结合起来)在链接的帖子中.