编程语言
首页 > 编程语言> > javascript-在原型类中定义递归函数?

javascript-在原型类中定义递归函数?

作者:互联网

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

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

  this.rotate();
 }

 rotate: function() {
   do something...

   this.rotate()
 }
}

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

解决方法:

回答:

您所拥有的应该可以正常工作(下面是我认为是错别字的几则除外),因为您正在从属性访问函数.请注意,这意味着如果您在使用继承,则将重新输入最顶部(子类别最多的)rotate函数,因为这是分配给实例rotation属性的那个.

您说的是说this.rotate不是函数.你怎么称呼它?因为如果您正在执行以下操作:

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

或(旋转内):

setInterval(this.rotate, 1000);

…这是行不通的,因为您只是将函数(而不是其上下文)传递给setInterval.这将工作:

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

或(旋转内):

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的函数的所有优点(而不是将匿名函数绑定到属性),以及获得私有的全类函数(如果这对您有用).这是我最常使用的习惯用法(尽管我使用辅助程序使语法更简洁;以下是原始的原型):

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;
})());

关于the linked post的更多信息(以及为什么不能将上面的pubs和function链接结合在一起).

标签:javascript,prototypejs
来源: https://codeday.me/bug/20191024/1918073.html