首页 > 解决方案 > TypeError:无法在 Object.addDishToCourse 读取未定义的属性“推送”

问题描述

真的很难弄清楚我在这里做错了什么,任何帮助将不胜感激。我在下面收到此错误:

this._courses[courseName].push(dish);

TypeError:无法在 Object.addDishToCourse 读取未定义的属性“推送”

const menu = {
  _courses: {
    appetizers: [],
    mains: [],
    desserts: [],  
    get appetizers() {
      return this._courses.appetizers;
    },
    get mains() {
      return this._courses.mains;
    },
    get desserts() {
      return this._courses.desserts;
    },
    set appetizers(appetizers) {
      this._courses.appetizers = appetizers;
    },
    set mains(mains) {
      this._courses.mains = mains;
    },
    set desserts(desserts) {
      this._courses.desserts = desserts;
    }
  },
  get _courses() {
    return {
      appetizers: this.appetizers,
      mains: this.mains,
      desserts: this.desserts
    };
  },
  addDishToCourse (courseName, dishName, dishPrice) {
    const dish = {
      name: dishName,
      price: dishPrice
    };
    return this._courses[courseName].push(dish);
  },
  getRandomDishFromCourse(courseName) {
    const dishes = this._courses[courseName];
    const randomIndex = Math.floor(Math.random() * dishes.length);
    return dishes[randomIndex];
  },
  generateRandomMeal() {
    const appetizers = this.getRandomDishFromCourse('appetizers');
    const mains = this.getRandomDishFromCourse('mains');
    const desserts = this.getRandomDishFromCourse('desserts');
    const totalPrice = appetizers.price + mains.price + desserts.price 
    return `Your meal is $${totalPrice}.`;
  }
};

menu.addDishToCourse('appetizers', 'Ceaser Salad', 4.25);

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

标签: javascripttypeerror

解决方案


您正在锁定get appetizers()课程对象内的吸气剂。因此,当您尝试get _courses()通过仅调用this.appetizers而不是调用来使用它时,this.courses.appetizers您会返回未定义。

原来的

_courses: {
    appetizers: [],
        mains: [],
            desserts: [],
                get appetizers() {
        return this._courses.appetizers;
    },
    get mains() {
        return this._courses.mains;
    },
    get desserts() {
        return this._courses.desserts;
    },
    set appetizers(appetizers) {
        this._courses.appetizers = appetizers;
    },
    set mains(mains) {
        this._courses.mains = mains;
    },
    set desserts(desserts) {
        this._courses.desserts = desserts;
    }
}

解决方案

从课程对象中获取这些方法,使其仅包含属性:

_courses: {
    appetizers: [],
    mains: [],
    desserts: []
},

代码最终应该是这样的:

const menu = {
    _courses: {
        appetizers: [],
        mains: [],
        desserts: [],
        get appetizers() {
            return this._courses.appetizers;
        },
        get mains() {
            return this._courses.mains;
        },
        get desserts() {
            return this._courses.desserts;
        },
        set appetizers(appetizers) {
            this._courses.appetizers = appetizers;
        },
        set mains(mains) {
            this._courses.mains = mains;
        },
        set desserts(desserts) {
            this._courses.desserts = desserts;
        }
    },
    get _courses() {
        return {
            appetizers: this.appetizers,
            mains: this.mains,
            desserts: this.desserts
        };
    },
    addDishToCourse(courseName, dishName, dishPrice) {
        const dish = {
            name: dishName,
            price: dishPrice
        };
        return this._courses[courseName].push(dish);
    },
    getRandomDishFromCourse(courseName) {
        const dishes = this._courses[courseName];
        const randomIndex = Math.floor(Math.random() * dishes.length);
        return dishes[randomIndex];
    },
    generateRandomMeal() {
        const appetizers = this.getRandomDishFromCourse('appetizers');
        const mains = this.getRandomDishFromCourse('mains');
        const desserts = this.getRandomDishFromCourse('desserts');
        const totalPrice = appetizers.price + mains.price + desserts.price
        return `Your meal is $${totalPrice}.`;
    }
};

menu.addDishToCourse('appetizers', 'Ceaser Salad', 4.25);

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

推荐阅读