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