我正在尝试使用getter和setter编写一个简单的对象,但我不确定是否该代码正确无误,在使用下划线的实例上我也有些困惑。我得到的当前错误是,menu.addDishToCourses is not a function
但是控制台记录了进餐,将其属性显示为一个函数。是什么赋予了?
let menu = {
_courses: {
_appetizer: [],
_main: [],
_dessert: [],
get appetizers() {
return this._courses.appetizer;
},
set appetizers(appetizerInput) {
this._courses.appetizer = appetizerIn;
},
get mains() {
return this._courses.main;
},
set mains(mainsInput) {
this._courses.main = mainsInput;
},
get desserts() {
return this._courses.dessert;
},
set desserts(dessertsInput) {
this._courses.deseserts = dessertInput;
},
get courses() {
return {
appetizers: this._courses.appetizer,
mains: this._courses.main,
desserts: this._courses.dessert,
};
},
addDishToCourses(courseName, dishName, dishPrice) {
const dish = {
name: dishName,
price: dishPrice,
};
this._courses[courseName].push(dish);
},
getRandomDishFromCourse(courseName) {
const dishes = this._courses[courseName];
const RandomIndex = Math.floor(Math.random() * dishes.length);
return dishes[RandomIndex];
},
generateRandomMeal() {
let appetizer = this.getRandomDishFromCourse('appetizer');
let main = this.getRandomDishFromCourse('main');
let dessert = this.getRandomDishFromCourse('dessert');
let totalPrice = appetizer.price + main.price + dessert.price;
return `You order and appetizer ${appetizer.name},${main.name} and a main dish ${main.price} and a dessert ${dessert.price}. Total price was $${totalProice}. `;
},
}
};
menu.addDishToCourses('_appetizer', 'pepperoni', 5.43);
menu.addDishToCourses('_mains', 'steak', 18.0);
menu.addDishToCourses('_dessert', 'pie', 3.5);
您有范围问题。this
在您的getter和setter方法中,引用的是_courses
属性,而menu
不是menu
对象本身。
您可能想要设计menu
类似于以下内容的对象:
let menu = {
_courses: {
_appetizer: [],
_main: [],
_dessert: [],
get appetizer() {
return this._appetizer
},
get main() {
return this._main
},
get dessert() {
return this._dessert
}
},
get courses() {
return {
appetizers: this._courses.appetizer,
main: this._courses.main,
desserts: this._courses.dessert,
};
},
addDishToCourses(courseName, dishName, dishPrice) {
let dish = {
name: dishName,
price: dishPrice,
};
//console.log(this._courses[courseName]);
this._courses[courseName].push(dish);
}
};
menu.addDishToCourses('_appetizer', 'pepperoni', 5.43);
menu.addDishToCourses('_main', 'steak', 18.0);
menu.addDishToCourses('_dessert', 'pie', 3.5);
console.log(menu.courses);
就下划线命名属性而言,这只是命名私有变量的JavaScript约定(因为您将使用面向公众的getter和setter方法访问那些私有变量)。下划线实际上并没有任何作用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句