正确编写带有函数的getter和setter

用户7496931

我正在尝试使用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);
汤姆·O

您有范围问题。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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

java:带有getter和setter的volatile私有字段

带有setter和getter的Null对象参考SAXParser Android

用Java编写的Setter和getter

如何编写C ++ getter和setter

快速正确使用getter和setter方法

构造函数和 Getter 和 Setter 方法

Java中的对象通信,没有带有getter和setter的静态变量

带有公共 getter 和 setter 的私有成员的目的是什么?C#

Getter和Setter函数帮助以及如何

如何访问 Object 的 getter 和 setter 函数?

Vuex语法错误,带有与getter和setter结合使用的本地计算功能

带有互斥锁的 getter 和 setter 什么时候是线程安全的?

如何编写带有循环,+-* /和%(模)的RoundDown()函数?

编写带有修饰函数和导入的模块

避免在Go中编写过多的getter和setter

我无法为受保护的属性编写 getter 和 setter

Getter-Setter和私有变量

没有成员的getter和setter

如何在Haxe中正确覆盖getter和setter

使用__call()而不是getter和setter方法是否正确?

我是否理解未正确使用getter和setter

使用Lombok的Java getter / setter生成带有注释的代码

带有原型的Javascript setter函数

用带有参数的函数的返回值编写if语句的正确方法是什么?

带有箭头函数语法的Getter

具有新的getter / setter语法的VS2017:如何在setter中编写多行?/

如果Kotlin已经具有getter和setter,为什么它们在数据类中具有componentN函数?

我应该使用构造函数getter和setter方法?

C ++:如何使getter和setter使用空的构造函数