【问题标题】:How do you acces an object instance in the second parameter of the Mootools fireEvent function?如何在 Mootools fireEvent 函数的第二个参数中访问对象实例?
【发布时间】:2011-12-18 07:41:56
【问题描述】:

我正在处理 Mootools 中的实现:[事件、选项]

我想将类属性传递给事件触发时调用的函数。我原以为我可以使用 this 来做到这一点,但 this 是未定义的。

我已经在下面的代码中注释了我的问题所在。我有一种感觉,这可能与 binding 有关,所以我现在就来看看。提前感谢您的帮助!

var Person = new Class({

    Implements: [Options, Events],

    initialize: function(options){
        this.setOptions(options);
    }

});

greet = function(name){
    log('Hello, I am ' + name);
}

var ryan = new Person({
    name: 'Ryan',
    onArrive: greet //add event 'arrive'
});
ryan.fireEvent('arrive', ryan.options.name); //ideally I would use this.options.name?

此代码有效,但在最后一行使用对象实例名称而不是 this 似乎很奇怪。

【问题讨论】:

    标签: javascript events mootools options


    【解决方案1】:

    当您触发事件时,这您的 ryan 实例。 要使其正常工作,只需进行以下更改

    function greet(name){
        log('Hello, I am ' + this.options.name); //<-- use this here 
    }
    
    ryan.fireEvent('arrive');
    

    但由于 greet 现在取决于实例,最好将其包含在您的类定义中

    var Person = new Class({
    
        Implements: [Options, Events],
    
        initialize: function(options){
            this.setOptions(options);
        },
        greet: function() { log('Hello, I am ' + this.options.name); //<-- use this here  }
    });
    

    var ryan = new Person({
        name: 'Ryan',
        onArrive: this.greet.bind(this)  //or a function() { /* log('Hello,... */}
    });
    

    【讨论】:

      【解决方案2】:

      this 关键字指的是当前对象。在您的情况下,this 可能是指全局对象(窗口)。您必须在 ryan 实例范围内,以便您可以将 ryan 引用为 this

      function fireEvent(e){
          this.fireEvent(e,this.options.name);
      }
      fireEvent.call(ryan,'arrive');  
      

      如果您不想再次使用对同一实例的引用,也可以重载 fireEvent 方法。像这样的东西:

      var originalFireEvent = Person.prototype.fireEvent;
      Person.prototype.fireEvent = function(e,o){
          var a = typeof this.options[o] !== 'undefined' ? this.options[o] : null;
          return originalFireEvent.call(this,e,a);
      }
      

      然后这样称呼它:

      ryan.fireEvent('arrive','name');
      

      【讨论】:

      • 这不是很moo-ish,它不是fireEvent的工作方式-默认情况下,回调绑定到实例而不是窗口。
      • 我不是在谈论 fireEvent 函数内部的引用,而是关于设置参数时的引用(您可以在任何其他范围内调用您的函数)。它与 mootools 无关。这都是关于标准 javascript 的。
      • 当你改变fireEvent方法的原型时,这一切都与mootools有关。让它总是绑定到实例,当它不需要时......正确/接受的方法是@jermel建议的。是的,在 javascript 中,您可以做任何您喜欢的事情,但这并不意味着在 mootools 类及其实例的上下文中这样做是正确的。 github.com/mootools/mootools-core/blob/master/Source/Class/… - 您正在扼杀 Specs 的行为,请参阅参数 3(延迟)。您应该添加一个依赖于原始原型的新方法 fireCustomEvent
      猜你喜欢
      • 2018-12-29
      • 1970-01-01
      • 1970-01-01
      • 2019-07-15
      • 2020-07-14
      • 2013-07-25
      • 1970-01-01
      • 2017-12-12
      • 1970-01-01
      相关资源
      最近更新 更多