2016-08-31 1 views
0

Не имеет ничего нового в использовании шаблона проектирования прототипа, поэтому у меня был быстрый вопрос о наиболее эффективном способе создания сеттера/получателя для нескольких переменных-конструкторов.Передача «этого» указателя от конструктора объекта к установщику/получателю в JS

Говорят, у меня была «поездка» объект:

function trip(){ 
    this.numberOfDays = 0 
    this.price = 0 
    this.activites = [] 
    this.bPacks = [] 
    this.pPacks = [] 
} 

Теперь сеттеры для деятельности, bPacks и pPacks все делать в первую очередь то же самое. Они добавят или удалят массив, с которым они связаны.

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

trip.prototype.addActivity = function(itemToAdd){ 
    var index = this.activites.push(itemToAdd) 
} 

trip.prototype.addBPack = function(itemToAdd){ 
     var index = this.bPack.push(itemToAdd) 
    } 

и т.д ...

Можно ли сделать что-то вроде этого:

trip.prototype.addPacksOrActivity = function(item,typeOfItem){ 
    this.typeOfItem.push(item); 
} 

где мы указать конкретное свойство объекта поездки, на который мы хотим нажать?

Любые предложения по более эффективному способу построения сеттеров/геттеров приветствуются, но я стараюсь избегать трансляции из ES6, поэтому предпочтение отдается ответам типа ES5.

+4

Прежде всего: [KISS] (https://en.wikipedia.org/wiki/KISS_principle). Вам действительно нужны индивидуальные геттеры и сеттеры? 'myTrip.activities.push (...)' не будет делать? А если нет: сначала вы должны беспокоиться о своем внешнем интерфейсе API. Вы действительно хотите 'myTrip.addPacksOrActivity (foo, 'pPacks')' ... ?! Выглядит ужасно. – deceze

+0

@deceze Я вижу вашу точку зрения. Вариант использования здесь - очень длинная форма, которую можно изменить несколько раз (если, скажем, пользователь пошел туда и обратно, чтобы изменить свой выбор). На данный момент код ужасен, и я ищу более структурированные шаблоны дизайна. Я вижу альтернативу, использующую хэш и просто извлечение/настройку с помощью Trip.price = foo и т. Д. – dpat

ответ

0

Да, вы можете использовать простой цикл, чтобы сделать это:

["activities", "bPacks", "pPacks"].forEach(function(typeOfItem) { 
    var methodName = "add"+typeOfItem[0].toUpperCase()+typeOfItem.slice(1); 
    Trip.prototype[methodName] = function(item) { 
     this[typeOfItem].push(item); 
    }; 
}); 

Обратите внимание на использование bracket notation и closure over typeOfItem.