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

时间:2010-12-10 18:08:36

标签: javascript class callback prototypejs

我正在使用原型1.7并构建一个基本上采用div列表并构建标签界面的类。

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

我的问题与我的 tabsRendered 自定义回调有关。回调运行时,this.setCurrent(link)什么都不做。

如果我将传递给回调,我的自定义回调会按预期工作。

if( this.options.tabsRendered ) {
    this.options.tabsRendered(this);
}

我的猜测是将 this 传递给回调并非最佳做法。那么,我如何允许从回调中访问方法?

由于

1 个答案:

答案 0 :(得分:2)

问题是tabsRendered 未绑定。使用Prototype,您必须使用bind()绑定匿名函数。在// init code之后:

if (Object.isFunction(this.options.tabsRendered))
  this.options.tabsRendered = this.options.tabsRendered.bind(this);

之后你可以调用this.options.tabsRendered(),在那个曾经匿名的函数中,this将引用正确的对象。有关绑定的详细信息,请参阅the Prototype API docs

编辑:评论:匿名函数不是唯一受影响的函数是正确的。它是函数定义范围内的this