Создаем функцию

function getPrice() {
    console.log(this.price);
}

Создаем объект

let products = {
    name: "Intel",
    price: 200,
}

С помощью метода call указываем контекст вызова функции

getPrice.call(products);

Первым аргументом в методе call должен указываться объект, дальше через запятую можно передавать другие параметры.

Метод apply работает аналогично, за той разницей, что параметры для метода нужно передавать в виде массива.

Пример с передачей параметра

function getPrice(currency){
        console.log(currency + this.price);
    }

let products = {
    name: "pc",
    price: 100,
    getPrice,
    };

getPrice.call(products, '$');

С помощью метода bind происходит привязка контекста, чтобы избежать его потери, при этом после использования bind контекст не может быть изменен с помощью call и apply.

 function getPrice(currency){
        console.log(currency + this.price);
    }

let products = {
    name: "pc",
    price: 100,
    getPrice,
    };

 let getPriceBind = products.getPrice.bind(products, "euro");

 getPriceBind();

Задачи по this

  1. Создать объект, который описывает ширину и высоту

прямоугольника, а также может посчитать площадь фигуры:

const rectangle = {width:..., height:..., getSquare:...};

function getSquare()
{
    return this.width * this.height;
}

const rectangle = {
    width: 100, 
    height:200, 
    getSquare,
};

console.log(rectangle.getSquare());
console.log(getSquare.call(rectangle)); // вызов с помощью метода call
  1. Создать объект, у которого будет цена товара и его скидка, а также

два метода: для получения цены и для расчета цены с учетом скидки:

function getPrice()
{
    return this.price;
}

function getPriceWithDiscount()
{
    return this.price * (100 - parseInt (this.discount))/100;
}

const price = {

price: 10,
discount: '15%',
getPrice,
getPriceWithDiscount,

 };

console.log(price.getPrice()); // 10

console.log(price.getPriceWithDiscount()); // 8.5
  1. Создать объект, у которого будет поле высота и метод “увеличить

высоту на один”. Метод должен возвращать новую высоту:

object.height = 10;

object.inc(); // придумать свое название для метода

object.height; // 11;

function newHeight()
{
    return this.height + 1;
}

let object  = {
    height: 5,
    newHeight,
}

object.height = 10;

console.log(object.newHeight()); // придумать свое название для метода

console.log(object.height); // 11;
  1. Создать объект “вычислитель”, у которого есть числовое свойство

“значение” и методы “удвоить”, “прибавить один”, “отнять один”.

Методы можно вызывать через точку, образуя цепочку методов:

const numerator = {

value: 1,

double: function () {...},

plusOne: function () {...},

minusOne: function () {...},

}

numerator.double().plusOne().plusOne().minusOne();

numerator.value // 3

const numerator = {

value: 1,

double: function () {
    this.value *= 2;
    return this;
},

plusOne: function () {
    this.value++;
    return this;
},

minusOne: function () {
    this.value--;
    return this;
},

}

numerator.double().plusOne().plusOne().minusOne();

console.log(numerator.value) // 3
  1. Создать объект с розничной ценой и количеством продуктов.

Этот объект должен содержать метод для получения общей стоимости всех товаров (цена * количество продуктов)

function getTotal()
{
    return this.amount * this.price;
}

let products = {
    amount: 10,
    price: 5,
    getTotal,
}

console.log(getTotal.call(products)); // 50
  1. Создать объект из предыдущей задачи. Создать второй объект, который описывает количество деталей и цену за одну деталь. Для второго объекта нужно узнать общую стоимость всех деталей, но нельзя создавать новые функции и методы.

Для этого “позаимствуйте” метод из предыдущего объекта.

function getTotal()
{
    return this.amount * this.price;
}

let products = {
    amount: 10,
    price: 5,
    getTotal,
}

let products1 = {
    amount: 20,
    price: 6,

}

products1.getTotal = products.getTotal;
console.log(products1.getTotal()); // 120
  1. Даны объект и функция:

let sizes = {width: 5, height: 10},

getSquare = function () {return this.width * this.height};

Не изменяя функцию или объект, получить результат функции getSquare для объекта sizes

let sizes = {width: 5, height: 10},

getSquare = function () {return this.width * this.height};

console.log(getSquare.call(sizes));
  1. let element = {

height: 25,

getHeight: function () {return this.height;}

};

let getElementHeight = element.getHeight;

getElementHeight(); // undefined

Измените функцию getElementHeight таким образом, чтобы можно было вызвать getElementHeight() и получить 25.

et element = {

height: 25,

getHeight: function () {return this.height;}

};

let getElementHeight = element.getHeight;

console.log(getElementHeight.call(element)); // undefined