@75db77

Правильно ли я понимаю функцию(предназначение) слова this в даном примере?

Есть такой код:
module.exports = function Cart(oldCart) {
    this.items = oldCart.items || {};                
    this.totalQty = oldCart.totalQty || 0;           
    this.totalPrice = oldCart.totalPrice || 0;

    this.add = function(item, id) {
        var storedItem = this.items[id];
        if (!storedItem) {
            storedItem = this.items[id] = {item: item, qty: 0, price: 0};
        }
        storedItem.qty++;
        storedItem.price = storedItem.item.price * storedItem.qty;
        this.totalQty++;
        this.totalPrice += storedItem.item.price;
    };

 this.reduceByOne = function(id) {              
        this.items[id].qty--;
        this.items[id].price -= this.items[id].item.price;
        this.totalQty--;
        this.totalPrice -= this.items[id].item.price;

        if (this.items[id].qty <= 0) {
            delete this.items[id];
        }
    };

Насколько я понял ключевое слово this служит для того что б обратиться к новосозданному обьекту.
Тоесть если взять только эти строки:
this.items = oldCart.items || {};
this.totalQty = oldCart.totalQty || 0;
this.totalPrice = oldCart.totalPrice || 0;

то новосозданный обьект выглядит вот так:
var Cart = {
    items = oldCart.items || {},               
    totalQty = oldCart.totalQty || 0,           
    totalPrice = oldCart.totalPrice || 0
}

Или здесь другая функция(предназначение) слова this? И оно не служит для того что б обратиться к новосозданному обьекту?

А вот дальше такой код идет:
this.add = function(item, id)
и еще онда функция:
this.reduceByOne = function(id)
Какая функция(предназначение) у этих this?
Вот тут я совсем не понимаю для чего this.
  • Вопрос задан
  • 157 просмотров
Решения вопроса 1
ruddy22
@ruddy22
Спасение утопающих — дело рук самих утопающих
привет.
если говорить коротко, да и про JS, то ты на верном пути.
ключевое слово `this` указывает на контекст исполнения функции, соответственно контекст можно менять.
к явным методам изменения контектса относят методы: `bind`, `call`, `apply`, к неявным - оператор "точка" (`obj.getName()`), ключевое слово `new` и другие случаи.

те 2 сниппета, что ты указал с примерами `Сart` не равнозначны, хоть занимаются, примерно, одним и тем же.

разберем пример неявного случая с оператором "точка":
/**
 * какая-то функция, которая возвращает поле объекта name
 * @returns {String}
 */
function getName () {
  return this.name ? this.name : null;
}

var obj1 = {
  name: 'name1',
  getName: getName
}

var obj2 = {
  name: 'name2',
  getName: getName
}

// в данном случае, getName смотрит на obj1#name
console.log(obj1.getName()) // name1

// в данном случае, getName смотрит на obj2#name
console.log(obj2.getName()) // name2


советую, ознакомиться с методами задания контекста исполнения функции в книге `Reliable JavaScript: How to Code Safely in the World's Most Dangerous Language`, там достаточно наглядно описано.

если лень читать книгу, то посмотри эти 2 раздела: learn.javascript.ru/functions-closures и learn.javascript.ru/objects-more
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы