Ответ 1
TBH, mootools
.bind
, как вы его называете, просто Function.bind
в ES5 - и доступен изначально в браузерах, поддерживающих js 1.8.5 + spec. MooTools только усиливает браузеры, у которых его еще нет, но позволяет встроенная реализация оставаться на прототипе - если она доступна.
https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/bind
Вы можете легко реализовать это как декоратор a Function.prototype.bind
, если он не доступен изначально и использовать его в качестве примера выше:
// Function.prototype.bind polyfill
if ( !Function.prototype.bind ) {
Function.prototype.bind = function( obj ) {
if(typeof this !== 'function') // closest thing possible to the ECMAScript 5 internal IsCallable function
throw new TypeError('Function.prototype.bind - what is trying to be bound is not callable');
var slice = [].slice,
args = slice.call(arguments, 1),
self = this,
nop = function () {},
bound = function () {
return self.apply( this instanceof nop ? this : ( obj || {} ),
args.concat( slice.call(arguments) ) );
};
bound.prototype = this.prototype;
return bound;
};
}
Как вы можете видеть, это немного больше, чем просто .apply
/.call
Следует учитывать, что если вам нужно использовать bind или вы можете сохранить ссылку вместо этого.
например.
var self = this;
this.target.bind("click", function(e) {
var tip = self.opts.tip;
});
это имеет меньший размер, чем привязка функции. он также дает вам правильную ссылку на this
в качестве триггерного элемента (event.target === this
). вы обнаружите этот шаблон гораздо чаще в mootools-core, чем привязанный, хотя привязка часто требуется, когда вы хотите назначать события методам класса, например:
this.element.addEvents({
click: this.showTip.bind(this),
mouseleave: this.hideTip.bind(this)
});
В этом случае сохранение ссылки не будет работать, хотя вы можете переписать ее как
var self = this;
this.element.addEvents({
click: function(e) {
self.showTip(e);
}
});
Специальная реализация jQuery - proxy
- http://api.jquery.com/jquery.proxy/