JS Object,如何从我自己内部访问对象

时间:2012-02-12 21:47:16

标签: javascript jquery oop

所以,我认为没有理由说这不起作用,但我陷入了困境。为什么我不能在wyr.message.close函数中调用this.myself?也许我对此的理解是松散的,但我确信这是指对象本身,而不是功能。

this.myself is undefined

代码:

wyr.message = {
    myself: $('.message'),
    init: function() {
        if(this.myself.is(':visible')){
            setTimeout(this.close, 5000);
        }
    },
    close: function(){
        this.myself.fadeOut(1200,function(){
            this.myself.remove();
        });
    }
}

2 个答案:

答案 0 :(得分:1)

wyr.message = {
    myself: $('.message'),
    init: function() {
        var self = this;
        if(this.myself.is(':visible')){
            setTimeout(function(){
                self.close();
            }, 5000);
        }
    },
    close: function(){
        this.myself.fadeOut(1200,function(){
            $(this).remove();
        });
    }
}

问题在于背景。在传递给fadeOut的回调函数中,this绑定到jQuery正在处理的元素,而不是wyr.message对象。

修改

init方法也存在问题。 SetTimeout会将this的值绑定到全局(window)对象 - 因此我们保存对我们想要的this的引用,并使用它来调用{{1}方法。

您还可以查看close,但旧版浏览器不支持此功能。

答案 1 :(得分:0)

首先,在创建对象实例时评估javascript对象文字属性表达式。 myself将是那个选择器当时抓取的东西,这可能是什么都没有。如果您希望它在调用时返回myself的值,则$('.message')属性必须是一个函数。因此,您还需要将所有用途更改为函数调用。

其次,在执行setTimeout回调期间,this绑定到窗口对象,因此您需要对其进行适当的限定:

  wyr.message = {
    myself: function() { return $('.message'); },
    init: function() {
      if(this.myself().is(':visible')){
        setTimeout(this.close, 5000);
      }
    },
    close: function(){
      message.myself().fadeOut(1200,function(){
        $(this).remove();
      });
    }
  };

(注意,当超时触发时,这将淡出并删除与选择器匹配的所有内容。)