Javascript 在回调[prototype]中访问类方法的正确方法

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 ||

我正在使用prototype 1.7构建一个类,该类基本上包含一个div列表,并构建一个tab接口

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
。我编辑。谢谢你接受。