Давайте посмотрим, как создать собственный метод привязки.

//javascript bind method

let myName = {
    firstName:"Jhon",
    lastName:"Doe"
}

let printMyName = function(state,city){
    console.log(this.firstName + " " + this.lastName + " from "+ state+" , "+city);
}

let printFullNameBind = printMyName.bind(myName,"Karnataka");

printFullNameBind("Bangalore");

//lets create our own bind method

Function.prototype._bind = function (...args) {
    let obj = this;
    let params = args.slice(1)
    return function(...args2){
        obj.apply(args[0],[...params,...args2])//changed to apply bacause params is an array
    }
}

//lets test our bind method

let printFullName_Bind = printMyName._bind(myName,"Karnataka");

printFullName_Bind("Bangalore");

Давайте посмотрим объяснение каждой строки и резюме

Конечно! Давайте пройдемся по коду и объясним, что делает каждая часть:

1. Код определяет объект с именем `myName` со свойствами `firstName` и `lastName`. Значения установлены на «Jhon» и «Doe» соответственно.

2. Код определяет функцию printMyName, которая принимает два параметра: штат и город. Внутри функции он использует `console.log` для вывода полного имени вместе с предоставленными значениями `state` и `city`. Доступ к полному имени осуществляется с использованием `this.firstName` и `this.lastName`.

3. Строка printMyName.bind(myName, «Karnataka») демонстрирует метод bind, предоставляемый JavaScript. Метод `bind` создает новую функцию, которая при вызове имеет значение this, установленное на предоставленный объект (`myName`) и любые дополнительные аргументы (`”Karnataka”`). Возвращаемая функция сохраняется в переменной printFullNameBind.

4. Строка `printFullNameBind(“Bangalore”) вызывает функцию `printFullNameBind`, которая была создана с использованием метода `bind`. Значение `this` внутри функции относится к объекту `myName`, а аргументы `”Karnataka” и `”Bangalore” передаются функции. В результате он печатает «Джон Доу из Карнатаки, Бангалор».

5. Затем код определяет новый метод `_bind` для `Function.prototype`. Это позволяет всем функциям обращаться к пользовательскому методу _bind.

6. Метод `_bind` принимает любое количество аргументов, используя оператор распространения `…args`. Первый аргумент (`args[0]`) является объектом контекста (`myName`), а остальные аргументы (`args.slice(1)`) хранятся в переменной `params`.

7. Метод `_bind` возвращает новую функцию, созданную с помощью замыкания. Эта возвращаемая функция принимает любое количество аргументов, используя оператор расширения `…args2`. При вызове он вызывает исходную функцию (`obj`) с сохраненным объектом контекста и комбинированными аргументами (`[…params, …args2]`) с использованием метода `apply`. Метод `apply` гарантирует, что аргументы передаются в виде массива.

8. Строка printMyName._bind(myName, «Karnataka») демонстрирует использование пользовательского метода _bind. Он создает новую функцию `printFullName_Bind` со значением `this`, установленным в `myName`, и предварительно заполненным аргументом `”Karnataka”.

9. Строка `printFullName_Bind(“Bangalore”)` вызывает функцию `printFullName_Bind`, которая была создана с использованием пользовательского метода `_bind`. В результате печатается «Джон Доу из Карнатаки, Бангалор».

Подводя итог, код сначала демонстрирует использование встроенного метода `bind` для создания новой функции с предопределенным значением `this` и частично заполненными аргументами. Затем он определяет собственный метод `_bind` для `Function.prototype`, чтобы воспроизвести функциональность `bind`, используя замыкание и метод `apply`. Наконец, показано, как использовать пользовательский метод _bind для создания новой функции с предварительно заполненными аргументами и ее вызова.