jQuery的原型代码(bind(this)vs closures)

时间:2011-05-25 22:21:28

标签: jquery prototypejs

Mornin'all。

我正在将原型代码重写为JQuery插件,并且不知道如何处理这一部分:

this.observers = events.map(function(name) {
   var handler = this["on" + name.].bind(this);
   this.element.observe(name, handler);
   return { name: name, handler: handler };
}.bind(this));

我最终得到了:

this.observers = $.each(events , function(i, name) {
   var handler = "on"+name;
   $element.live({
      name: handler
   });
}

我完全错了? 我不明白原型bind()的目的。

感谢您的帮助!

编辑:上下文是一个插件init()函数,我附加“动态”事件,其处理程序编码为私有方法......

plugin.init = function() {

    // the plugin's final properties are the merged default and user-provided options (if any)
    plugin.settings = $.extend({}, defaults, options);

if (!plugin.observers) {
    var events = ("mouseover mouseout").split(" ");

    plugin.observers = $.map(events, $.proxy(function(name) {
        var handler = $.proxy(this['on' + name], this);
        $element.bind(name, handler);
        return { name: name, handler: handler };
    }, this));

}
console.log(plugin.observers);
}

1 个答案:

答案 0 :(得分:1)

关于Prototype-to-jQuery的翻译(首先阅读我对bind / proxy的上述解释),这应该与上面的代码段紧密匹配:

this.observers = $.map(events, $.proxy(function(name) {
  var handler = $.proxy(this['on' + name], this);
  this.element.bind(name, handler);
  return { name: name, handler: handler };
}, this));

我假设从Prototype片段:

  • this是原型类或当前上下文的普通JS对象。
  • this.element是对DOM元素的引用,在jQuery案例中是jQuery包装的DOM元素。
  • onclick, onfocus和类似的可能回调是this上下文中的方法。

如果没有关于你的代码如何工作的更多上下文或者你试图重写的Prototype插件的哪一部分,那么就像我可以帮助你一样(我希望这已经足够了)。