2017-12-14 3 views
0

나는 왜 내 요리를 course [courseName]에 addDishToCourse 메서드로 푸시 할 수 없는지를 알아낼 것 같다. courseName은 배열이므로 어떤 문제도 있어서는 안된다. (실제로는 사실이 아니다.> <) . 도와주세요? JS의 .push에서 코드가 깨졌습니다.

const menu = { 
    _courses : { 
     _appetizers : [], 
     _mains : [], 
     _desserts : [] 
    }, 

>> set appetizers(appetizerIn) { 

    }, 
    get appetizers() { 

    }, 
    set mains(mainIn) { 

    }, 
    get mains() { 

    }, 
    set desserts(dessertIn) { 

    }, 
    get desserts() { 

    }, 
    get courses() { 
     return { 
     appetizers : this._courses.appetizers, 
     mains : this._courses.mains, 
     desserts : this._courses.desserts 
     } 

    }, 
     //Below is where my code breaks with the .push 

    addDishToCourse(courseName, dishName, dishPrice) { 
     let dish = { 
     name : dishName, 
     price : dishPrice 
     }; 
     this._courses[courseName].push(dish); 

    }, 
    getRandomDishFromCourse(courseName) { 
     const dishes = this._courses[courseName]; 
     const randomIndex = Math.floor(Math.random() * this.dishes.length); 
     return dishes[randomIndex]; 
    }, 

    generateRandomMeal() { 
     const appetizer = this.getRandomDishFromCourse('appetizers'); 
     const main = this.getRandomDishFromCourse('mains'); 
     const dessert = this.getRandomDishFromCourse('desserts'); 
     //const totalPrice = appetizers.price + mains.price + desserts.price; 

     return `Your appetizer is ${appetizers.name} followed by the main meal, which will be ${mains.name}, and finally you will have ${desserts.name} for dessert.`;// Your bill will be of ${totalPrice}.`; 
    } 

    }; 

    menu.addDishToCourse('appetizers', 'Caesar Salad', 3.75); 
    menu.addDishToCourse('appetizers', 'Srimp Cocktail', 6.50); 
    menu.addDishToCourse('appetizers', 'Escargots Gratines', 4.50); 
    menu.addDishToCourse('mains', '16oz Ribeye', 38); 
    menu.addDishToCourse('mains', 'Smoked Salmon', 18); 
    menu.addDishToCourse('mains', 'Grilled Chicken Breast', 19); 
    menu.addDishToCourse('desserts', 'Chocolate Lava Cake', 3.50); 
    menu.addDishToCourse('desserts', 'Tiramisu', 4); 
    menu.addDishToCourse('desserts', 'Kiev Cake', 6.50); 

    let meal = menu.generateRandomMeal(); 
    console.log(meal); 

는 지금은 .push 해결하기 위해 if 문을 사용했지만, 그건 그냥 다른 곳에서 코드를 끊었다. 그렇지 않으면, 나는 잠재적으로 setter 메소드를 사용한다는 것을 알고 있지만, 그 중 하나를 다루는 방법에 대해서는 너무 확신하지 못한다. addDishToCourse를 설정하겠습니까?

나는 (초현실적 인 코드^_ ^에서 알 수 있듯이) 초보자이므로 어떤 도움이라도 대단히 감사하겠습니다!

+1

' "_something"! == "something"' – Dummy

+0

이 이슈와 관련이 없지만 IMHO getter 함수는 배열의 복사본을 반환해야하며, setter는 마찬가지로 전달 된 배열을 로컬 배열에 복사해야합니다 . 그렇지 않으면 내부 데이터에 대한 참조를 얻는이 클래스의 클라이언트가 _ place_에서 수정할 수 있고 객체의 캡슐화를 해제 할 수 있습니다. – Alnitak

+0

감사합니다 @Alnitak! 일단 내가 더 편안하게되면 세터/게터를 확실히 수정할 것입니다. 나는 그런 생각을 한 적이 없으며 미래를 위해 유용 할 것입니다^_^ – ChronicLogic

답변

1

새 인스턴스를 만들 때 courseName_courses 개체의 키 이름과 일치해야합니다. 귀하의 코드에서 이러한 모든 이름 앞에 밑줄이 표시되어 코드가 분리됩니다.

예를 들어

:

menu.addDishToCourse('appetizers', 'Caesar Salad', 3.75); 

당신은 물론 이름으로 "전채"에 전달하는 ...

addDishToCourse(courseName, dishName, dishPrice) { 
    let dish = { 
    name : dishName, 
    price : dishPrice 
    }; 
    this._courses[courseName].push(dish); 
}, 

... 당신은에 "전채"를 추가하려는 _courses이지만 _courses의 키 이름은 _appetizers입니다.

오브젝트 키의 이름을 각각 appetizer, mainsdessert으로 변경합니다.

+0

어떻게 든 _courses 키를 변경하지 않고 해당 _setter/getters에 _을 쓰지 않고 각각의 이름을 붙일 수 있습니까? 또한 키 값에서 _을 제거하려고 시도했는데 이제는 .legth 방법의 heh에서 중단됩니다. 그래서 dishes.length 에 대해 코드를 변경했지만 $ {appetizers.name}에 코드가 깨져서 $ {menu._courses.appetizers.name} 으로 바뀌 었습니다. 이제 "귀하의 애피타이저가 있습니다. .. "하지만 모든 값은 정의되지 않습니다. 너무 가난 스럽다면 정말 유감입니다. (책을 배워야 만합니다. – ChronicLogic

+0

'_courses' 오브젝트의 밑줄이 충분하지 않은 이유는 무엇입니까? – Andy

관련 문제