Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 01.07.2019, 23:36
Аспирант
Отправить личное сообщение для nathan111777 Посмотреть профиль Найти все сообщения от nathan111777
 
Регистрация: 12.05.2019
Сообщений: 44

Правильно ли я понимаю функцию(предназначение) слова 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? обращение к новосозданным объектам? или другая какая-то функция у них?

Последний раз редактировалось nathan111777, 01.07.2019 в 23:38.
Ответить с цитированием
  #2 (permalink)  
Старый 02.07.2019, 00:53
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,563

Точно также продолжая твою мысль:
//сделав так 
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;
__________________
29375, 35

Последний раз редактировалось Aetae, 02.07.2019 в 01:01.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сортировка массива с объектами на javascript sergiu920 Элементы интерфейса 2 07.12.2018 09:47
правильно ли понимаю CRUD Ext.js ruvi ExtJS 2 06.08.2014 11:25
Центрирование Div-а ч2 alex2012 jQuery 0 15.11.2012 19:01