Ответ 1
Кто-то отредактировал часть, которая делает ее полезной. Вот как оно выглядит:
Function.prototype.bind = function( obj ) {
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) ) );
};
// These lines are the important part
nop.prototype = self.prototype;
bound.prototype = new nop();
return bound;
};
Я ответил на другой вопрос, который задавал одно и то же (но когда код был прав) здесь: вопрос функции привязки mozilla.
Причина проверки this instanceof nop
заключается в том, что если вы вызываете связанную функцию как конструктор (т.е. с оператором new
), this
привязан к новому объекту, а не к тому, что вы передали в bind
.
Чтобы объяснить "важную часть", nop
в основном вставляется в цепочку прототипов, поэтому при вызове функции как конструктора this
есть экземпляр nop
.
Итак, если вы запустите var bound = original.bind(someObject);
, цепочка прототипов будет выглядеть так:
original | nop | bound
Мое предположение, почему они использовали nop
вместо this instanceof self
, так это, чтобы связанная функция имела собственное свойство prototype
(которое наследуется от self
's). Возможно, это не предполагало, почему это было частично отредактировано. Независимо от того, что код, как сейчас, неверен, но будет работать до тех пор, пока вы не используете эту функцию в качестве конструктора.