gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 10:00:08 24 4
gpt4 key购买 nike

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

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

this.rotate();
}

rotate: function() {
do something...

this.rotate()
}
}

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

最佳答案

回答:

你在那里的东西应该可以工作(除了一些我认为是拼写错误的东西;下面),因为你正在从属性访问函数。请注意,这意味着如果您使用继承,您将重新进入最顶层(最子类)的 rotate 函数,因为这是分配给实例 rotate 属性。

你说的是 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

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

FWIW,您可以避免打字错误,例如遗漏函数之间的逗号,并且获得具有 real names 的函数的所有好处(与绑定(bind)到属性的匿名函数相反)加上获得类范围内的私有(private)函数(如果这对您有用的话)。这是我最常使用的习惯用法(尽管我使用了一个帮助程序来使语法更清晰一些;下面是原始原型(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;
})());

the linked post 中有更多关于该习语的信息(以及为什么您不能结合上面的 pubsfunction 链接) .

关于javascript - 在原型(prototype)类中定义递归函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2668645/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com