# 章序号/节序号/节/笔记序号 - Objective:解决什么问题 # 概念阐释 # 举例子 # 类比、比较与对比 # 问题 - [练习题](https://www.codecademy.com/courses/introduction-to-javascript/projects/meal-maker) 一家餐厅雇用了你来为他们的网站创建一个函数,允许他们每天早上设置今日特餐的菜品和价格。利用你对获取器`getter`和设置器`setter`的知识,确保任何使用新函数的人都可以生成今日特餐的菜品和价格,避免出现不必要的错误! 1. 创建菜单对象 1. 创建menu对象 2. 添加不想被改变的属性meal,string为空 3. 添加不想被改变的属性price,值为0 4. 测试添加了_的属性。(*如果乱写,返回结果也不会报错,所以在使用setter时要先用if条件确认数据类型*) 2. 添加setter方法 1. 设置`meal`方法和参数`mealToCheck`,如果数据类型为字符,则_meal属性可以等于新的参数`mealToCheck` 2. 设置`price`方法和参数`priceToCheck`,如果数据类型为数字,则_price属性可以等于新的参数`priceToCheck` 3. 调用`meal`和`price`方法,赋新的值,用`console`测试是否改变了属性`_meal` `_price` 3. 添加getter方法 1. 添加get方法,todaysSpecial 2. 确认属性都有值,则返回结果`Today's Special is ${this._meal} for ${this._price}.`,否则显示缺少属性值 4. 得到今天特餐 1. 用`console`得到`get`关键字中的结果 **挑战题**: 如果你想扩展你在这个项目上的学习,尝试添加一个餐品和价格的数组,随机设置并获取今日特价! # 问题答案 1-4 ```js menu._meal = 8; menu._price = 'Pizza'; console.log(menu); //print {_menu:'',price:'pizza',_meal:8} ``` ```js let menu = { _meal:'', _price:0, //确认属性为挣钱的数据类型 set meal(mealToCheck) { if(typeof mealToCheck === 'string'){ return this._meal = mealToCheck; } }, set price(priceToCheck) { if(typeof priceToCheck === 'number'){ return this._price = priceToCheck; } }, //确认属性都有值,则返回结果,否则显示缺少属性值 get todaysSpecial() { if(this._meal&& this._price){ return `Today's Special is ${this._meal} for ${this._price}.` }else{ return 'Meal or price was not set correctly!' } } }; //给属性设置(set)新的值 menu.meal = '油焖大虾'; menu.price = 25; console.log(menu.todaysSpecial); ``` # 备注(经验集/错误集) ## summary 解决的怎么样? ## 参考资料