2015-12-31 3 views
2

Я создал новую переменную carBasket и foodBasket и установил их равными функции basketModule(). Однако они указывают на ту же функцию, когда я хочу, чтобы каждая из этих двух переменных указывала на их собственную функцию. Мне интересно, что я должен делать, чтобы достичь этого?Переменные, указывающие на ту же функцию

var basketModule = (function() { 
    var basket = []; 
    return { 
     addItem: function(values) { 
      basket.push(values); 
     }, 
     getItemCount: function() { 
      return basket.length; 
     } 
    }; 
}()); 

carBasket = basketModule; 
carBasket.addItem('Audi'); 

foodBasket = basketModule; 
foodBasket.addItem('Ham'); 

foodBasket.getItemCount(); //outputs 2 instead of 1 
+0

Назначение ссылок на объект не приводит объекты копируются. – Pointy

ответ

6

Вы должны вызвать функцию для каждого объекта, чтобы генерировать различные переменные для каждого из них, например:

var basketModule = function() { 
    var basket = []; 
    return { 
    addItem: function(values) { 
     basket.push(values); 
    }, 
    getItemCount: function() { 
     return basket.length; 
    } 
    }; 
}; 
var carBasket = basketModule(), 
    foodBasket = basketModule(); 
carBasket.addItem('Audi'); 
foodBasket.addItem('Ham'); 
foodBasket.getItemCount(); // 1 

Однако для того, чтобы повторно использовать методы для всех случаев, лучше использовать конструктор :

var BasketModule = function() { 
    this.basket = []; 
}; 
BasketModule.prototype.addItem = function(values) { 
    this.basket.push(values); 
}; 
BasketModule.prototype.getItemCount = function() { 
    return this.basket.length; 
}; 
var carBasket = new BasketModule(), 
    foodBasket = new BasketModule(); 
carBasket.addItem('Audi'); 
foodBasket.addItem('Ham'); 
foodBasket.getItemCount(); // 1 
+0

Спасибо. Используете ли вы «прототип» для сохранения памяти? – Jon

+0

@Jon Да, таким образом, я только определяю методы в прототипе только один раз, и все экземпляры используют их. В первом коде каждая корзина имеет свою собственную копию методов. – Oriol

+0

Это работает. Но мне было интересно, не лучше ли создавать объект с конструктором и свойствами вместо функции в первую очередь? – el3ati2

1

Вы должны рассмотреть пытается этот шаблон вместо:

var BasketModule = function() { 
    var basket = []; 
    return { 
     addItem: function(values) { 
      basket.push(values); 
     }, 
     getItemCount: function() { 
      return basket.length; 
     } 
    }; 
}; 

carBasket = new BasketModule(); 
carBasket.addItem('Audi'); 

foodBasket = new BasketModule(); 
foodBasket.addItem('Ham'); 

jsfiddle: https://jsfiddle.net/nvsbjset/

Это будет создавать отдельные объекты для каждого basket

Смежные вопросы