Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Правильно ли я понимаю функцию(предназначение) слова this в даном примере? (https://javascript.ru/forum/misc/77911-pravilno-li-ya-ponimayu-funkciyu-prednaznachenie-slova-v-danom-primere.html)

nathan111777 01.07.2019 23:36

Правильно ли я понимаю функцию(предназначение) слова this в даном примере?
 
Есть такой код Node.js код:
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.add = function(item, id)

и еще одна функция:
this.reduceByOne = function(id)

А для чего нужны эти два this? обращение к новосозданным объектам? или другая какая-то функция у них?

Aetae 02.07.2019 00:53

Точно также продолжая твою мысль:
//сделав так 
var cart = new Cart(oldCart);
//получишь 
cart = {
    items: oldCart.items || {};                
    totalQty: oldCart.totalQty || 0;           
    totalPrice: oldCart.totalPrice || 0;

    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;
    },

    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];
        }
    }
}
//и сможешь вызывать "методы" полученного объекта так:
cart.reduceByOne('id');
В js нет значения что и куда ты пихаешь, функции точно такие же объекты как и всё остальное.

P.S. Вообще код не правильный, т.к. каждый объект получит свои функции в качестве псевдометодов. Чтобы методы были настоящими(едины для всех созданных объектов) - надо добавлять их в прототип:
function Cart(oldCart) {
    this.items = oldCart.items || {};                
    this.totalQty = oldCart.totalQty || 0;           
    this.totalPrice = oldCart.totalPrice || 0;
}
Cart.prototype.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;
 };

Cart.prototype.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];
        }
 };
module.exports = Cart;


Часовой пояс GMT +3, время: 20:44.