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