Кто-то отредактировал ту часть, которая делает его полезным.Вот как это выглядело:
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
).Вполне возможно, что это не предполагается, поэтому может быть частично отредактировано.Несмотря на это, код в том виде, в каком он сейчас есть, не верен, но будет работать, если вы не используете функцию в качестве конструктора.