Ответ 1
Во-первых, важно понять разницу между прототипом объекта (представленным как [[Prototype]]
и доступным через функцию Object.getPrototypeOf
или устаревшее свойство __proto__
) и свойство для функции, имя которой prototype
. Каждая функция имеет свойство с именем prototype
, которое используется, когда функция вызывается с помощью new
.
Когда вы вызываете функцию с new
, эта функция снабжается значением this
, установленным для вновь построенного объекта, прототип которого (т.е. [[Prototype]]
) установлен в свойство prototype
функции называемый. То есть, когда вы вызываете new Foo()
, тогда, когда выполняется код внутри Foo
, значение this
будет объектом формы
{ [[Prototype]]: Foo.prototype }
Вкратце встретим листинг переменных:
-
fToBind
- связанная функция: дляfoo.bind(...)
,Foo
естьfToBind
. -
fBound
является связанной версиейfToBind
; это возвращаемое значение операцииbind
.fBound
действует как гейткипер для исходной функцииfToBind
и решает, что получаетthis
valuefToBind
при его вызове. -
oThis
- это первый аргумент, переданный вbind
, т.е. объект привязан к функцииthis
. -
fNOP
- это функция, для свойстваprototype
установлено значениеfToBind.prototype
-
fBound.prototype = new fNOP()
заставляет это быть правдой:Object.getPrototypeOf(fBound.prototype) === fNOP.prototype Object.getPrototypeOf(fBound.prototype) === fToBind.prototype
Когда fBound
вызывается с new
, то this
, который поставляется в fBound
, имеет вид
{ [[Prototype]]: fBound.prototype }
и fBound.prototype
является объектом вида
{ [[Prototype]]: fNOP.prototype }
делая полную форму this
эквивалентной
{ [[Prototype]]: { [[Prototype]]: fNOP.prototype } }
Итак, fNOP.prototype
находится в цепочке прототипов вновь созданного объекта this
, когда fBound
вызывается с new
. Это то, что тестирует операция object instanceof constructor
для:
Оператор
instanceof
проверяет наличиеconstructor.prototype
в цепочке прототиповobject
.
Порядок операций между &&
и тройным здесь:
(this instanceof fNOP && oThis) ? this : oThis
Если this
имеет fNOP.prototype
в своей цепочке прототипов, а исходный вызов bind
был предоставлен правдивый первый аргумент для привязки к функции, тогда используйте созданный natrually this
, указанный в fBound
, когда он вызывается с помощью new
и передает это значение fToBind
вместо привязки this
.