ÐбÑÑнÑй меÑод bind назÑваеÑÑÑ Â«Ñанним ÑвÑзÑванием», поÑколÑÐºÑ ÑикÑиÑÑÐµÑ Ð¿ÑивÑÐ·ÐºÑ ÑÑÐ°Ð·Ñ Ð¶Ðµ.
Ðак ÑолÑко знаÑÐµÐ½Ð¸Ñ Ð¿ÑивÑÐ·Ð°Ð½Ñ â они Ñже не могÑÑ Ð±ÑÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ñ. Ð Ñом ÑиÑле, еÑли меÑод обÑекÑа, коÑоÑÑй пÑивÑзали, кÑо-Ñо пеÑеопÑÐµÐ´ÐµÐ»Ð¸Ñ â «пÑивÑзаннаÑ» ÑÑнкÑÐ¸Ñ ÑÑого не замеÑиÑ.
Ðозднее ÑвÑзÑвание â более гибкое, оно позволÑÐµÑ Ð¿ÐµÑеопÑеделиÑÑ Ð¿ÑивÑзаннÑй меÑод когда Ñгодно.
Раннее ÑвÑзÑвание
ÐапÑимеÑ, попÑÑаемÑÑ Ð¿ÐµÑеопÑеделиÑÑ Ð¼ÐµÑод пÑи Ñаннем ÑвÑзÑвании:
function bind(func, context) {
return function() {
return func.apply(context, arguments);
};
}
var user = {
sayHi: function() { alert('ÐÑивеÑ!'); }
}
// пÑивÑзали меÑод к обÑекÑÑ
var userSayHi = bind(user.sayHi, user);
// понадобилоÑÑ Ð¿ÐµÑеопÑеделиÑÑ Ð¼ÐµÑод
user.sayHi = function() { alert('ÐовÑй меÑод!'); }
// бÑÐ´ÐµÑ Ð²Ñзван ÑÑаÑÑй меÑод, а Ñ
оÑелоÑÑ Ð±Ñ - новÑй!
userSayHi(); // вÑÐ²ÐµÐ´ÐµÑ "ÐÑивеÑ!"
â¦ÐÑивÑзка вÑÑ ÐµÑÑ ÑабоÑÐ°ÐµÑ Ñо ÑÑаÑÑм меÑодом, неÑмоÑÑÑ Ð½Ð° Ñо ÑÑо он бÑл пеÑеопÑеделÑн.
Ðозднее ÑвÑзÑвание
ÐÑи позднем ÑвÑзÑвании bind вÑÐ·Ð¾Ð²ÐµÑ Ð½Ðµ ÑÑ ÑÑнкÑиÑ, коÑоÑÐ°Ñ Ð±Ñла в sayHi на Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð¿ÑивÑзки, а ÑÑ, коÑоÑÐ°Ñ ÐµÑÑÑ Ð½Ð° Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð²Ñзова.**
ÐÑÑÑоенного меÑода Ð´Ð»Ñ ÑÑого неÑ, поÑÑÐ¾Ð¼Ñ Ð½Ñжно ÑеализоваÑÑ.
СинÑакÑÐ¸Ñ Ð±ÑÐ´ÐµÑ Ñаков:
var func = bindLate(obj, "method");
obj- ÐбÑекÑ
method- Ðазвание меÑода (ÑÑÑока)
Ðод:
function bindLate(context, funcName) {
return function() {
return context[funcName].apply(context, arguments);
};
}
ÐÑÐ¾Ñ Ð²Ñзов поÑ
ож на обÑÑнÑй bind, один из ваÑианÑов коÑоÑого как Ñаз и вÑглÑÐ´Ð¸Ñ ÐºÐ°Ðº bind(obj, "method"), но ÑабоÑÐ°ÐµÑ Ð¿Ð¾-дÑÑгомÑ.
ÐоиÑк меÑода в обÑекÑе: context[funcName], оÑÑÑеÑÑвлÑеÑÑÑ Ð¿Ñи вÑзове, Ñамой обÑÑÑкой.
ÐоÑÑомÑ, еÑли меÑод пеÑеопÑеделили â бÑÐ´ÐµÑ Ð¸ÑполÑзован вÑегда поÑледний ваÑианÑ.
Ð ÑаÑÑноÑÑи, пÑимеÑ, ÑаÑÑмоÑÑеннÑй вÑÑе, ÑÑÐ°Ð½ÐµÑ ÑабоÑаÑÑ Ð¿ÑавилÑно:
function bindLate(context, funcName) {
return function() {
return context[funcName].apply(context, arguments);
};
}
var user = {
sayHi: function() { alert('ÐÑивеÑ!'); }
}
var userSayHi = bindLate(user, 'sayHi');
user.sayHi = function() { alert('ÐдÑавÑÑвÑйÑе!'); }
userSayHi(); // ÐдÑавÑÑвÑйÑе!
ÐÑивÑзка меÑода, коÑоÑого неÑ
Ðозднее ÑвÑзÑвание позволÑÐµÑ Ð¿ÑивÑзаÑÑ Ðº обÑекÑÑ Ð´Ð°Ð¶Ðµ меÑод, коÑоÑого еÑÑ Ð½ÐµÑ!
ÐонеÑно, пÑедполагаеÑÑÑ, ÑÑо к моменÑÑ Ð²Ñзова он Ñже бÑÐ´ÐµÑ Ð¾Ð¿ÑеделÑн ;).
ÐапÑимеÑ:
function bindLate(context, funcName) {
return function() {
return context[funcName].apply(context, arguments);
};
}
// меÑода неÑ
var user = { };
// ..а пÑивÑзка возможна!
var userSayHi = bindLate(user, 'sayHi');
// по Ñ
Ð¾Ð´Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð´Ð¾Ð±Ð°Ð²Ð¸Ð»Ð¸ меÑод..
user.sayHi = function() { alert('ÐÑивеÑ!'); }
userSayHi(); // ÐеÑод ÑабоÑаеÑ: ÐÑивеÑ!
РнекоÑоÑом ÑмÑÑле, позднее ÑвÑзÑвание вÑегда лÑÑÑе, Ñем Ñаннее. Ðно Ñдобнее и надÑжнее, Ñак как вÑегда вÑзÑÐ²Ð°ÐµÑ Ð½ÑжнÑй меÑод, коÑоÑÑй в обÑекÑе ÑейÑаÑ.
Ðо оно влеÑÑÑ Ð¸ неболÑÑие накладнÑе ÑаÑÑ Ð¾Ð´Ñ â поиÑк меÑода пÑи каждом вÑзове.
ÐÑого
Ðозднее ÑвÑзÑвание иÑÐµÑ ÑÑнкÑÐ¸Ñ Ð² обÑекÑе в Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð²Ñзова.
Ðно иÑполÑзÑеÑÑÑ Ð´Ð»Ñ Ð¿ÑивÑзки в ÑÐµÑ ÑлÑÑаÑÑ , когда меÑод Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿ÐµÑеопÑеделÑн поÑле пÑивÑзки или на Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð¿ÑивÑзки не ÑÑÑеÑÑвÑеÑ.
ÐбÑÑÑка Ð´Ð»Ñ Ð¿Ð¾Ð·Ð´Ð½ÐµÐ³Ð¾ ÑвÑзÑÐ²Ð°Ð½Ð¸Ñ (без каÑÑинга):
function bindLate(context, funcName) {
return function() {
return context[funcName].apply(context, arguments);
};
}

ÐомменÑаÑии
<code>, Ð´Ð»Ñ Ð½ÐµÑколÑÐºÐ¸Ñ ÑÑÑок кода — Ñег<pre>, еÑли болÑÑе 10 ÑÑÑок — ÑÑÑÐ»ÐºÑ Ð½Ð° пеÑоÑниÑÑ (plnkr, JSBin, codepenâ¦)