Javascript 在回调[prototype]中访问类方法的正确方法
我正在使用prototype 1.7构建一个类,该类基本上包含一个div列表,并构建一个tab接口Javascript 在回调[prototype]中访问类方法的正确方法,javascript,class,callback,prototypejs,Javascript,Class,Callback,Prototypejs,我正在使用prototype 1.7构建一个类,该类基本上包含一个div列表,并构建一个tab接口 var tabs = Class.create({ initialize: function(container, options) { this.options = Object.extend({ // additional options tabsRendered: null, }, options ||
var tabs = Class.create({
initialize: function(container, options) {
this.options = Object.extend({
// additional options
tabsRendered: null,
}, options || {});
// init code
if( this.options.tabsRendered ) {
this.options.tabsRendered();
}
},
// additional methods
setCurrent: function(link){
//adds a .current class to tab clicked and its corresponding section
}
};
new vtabs( 'products', {
tabsRendered: function(){
if( window.location.hash != "" ) {
var link = $$( 'a[href$="' + window.location.hash + '"]');
this.setCurrent(link);
}
}
});
我的问题与自定义回调的选项卡相关。当回调运行时,this.setCurrent(link)
什么也不做
如果我将这个传递到回调中,我的自定义回调将按预期工作
if( this.options.tabsRendered ) {
this.options.tabsRendered(this);
}
我的猜测是,将这个传递到回调中不是最佳实践。那么,我如何允许从回调中访问方法呢
谢谢问题在于
选项卡已解除绑定。使用Prototype,您必须使用bind()
绑定匿名函数。在//init code
之后执行以下操作:
if (Object.isFunction(this.options.tabsRendered))
this.options.tabsRendered = this.options.tabsRendered.bind(this);
之后,您可以调用this.options.tabsrended()
,在这个一度匿名的函数中,this
将引用正确的对象。有关绑定的详细信息,请参阅
编辑:如评论所述:受影响的不仅仅是匿名函数,这是正确的。这是定义函数的作用域中的这个
。+1,尽管函数是否匿名并不重要,但与绑定无关。另外,bind
只是实现这一点的几种方法之一(尽管这是一种很好的方法)。有关此
并确保保存它的更多信息:感谢Goresplater,您的建议帮助很大。奇怪的是,“Prototype.isFunction(this.option.tabsRendered)”不起作用。事实上,它导致脚本停止执行。我的意思是Object.isFunction
。我编辑。谢谢你接受。