javascript - 为什么在JS中使用getter/setter而不是直接访问属性?

标签 javascript logic

以下两个代码是等效的并提供相同的结果:

1

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

menu.appetizers.push(['food']);
console.log(menu.appetizers);

2

const menu = {
    _courses: {
        appetizers: [],
        mains: [],
        desserts: [],
    },
}

menu._courses.appetizers.push(['food']);
console.log(menu._courses.appetizers);

第一种方法使用 getter/setter,而第二种方法直接访问属性,所以我的问题是..对我来说,第二种方法更容易理解,那么为什么 getter/setter 是“更好”的方式?

有很多线程建议为什么应该使用 getter/setter,但我很想知道对于我给出的示例,哪种方法更好?

最佳答案

getter 和 setter 是数据抽象,并提供验证检查的机会。

示例:

根据我的评论,

I want to create a property Age which should only accept numbers

下面是一个示例,它为类属性添加了有关其可能值的智能。这是 getter 和 setter 很有帮助的简单用例之一

function SimplePerson(name, age) {
  this.name = name;
  this.age = age;
}

function SmartPerson(name, age) {
  // Private validators
  function isNameValid(value) {
    return /^[a-z']+$/i.test(value);
  }

  function isAgeValid(value) {
    return /\d+/.test(value)
  }

  // Private property
  var name = '';
  var age;
  Object.defineProperty(this, 'name', {
    get: function() {
      return name;
    },
    set: function(value) {
      if (isNameValid(value)) {
        name = value;
      } else {
        console.log('Value passed for Name is incorrect')
      }
    }
  })

  Object.defineProperty(this, 'age', {
    get: function() {
      return name;
    },
    set: function(value) {
      if (isAgeValid(value)) {
        name = value;
      } else {
        console.log('Value passed for Age is incorrect')
      }
    }
  })
  
  this.name = name;
  this.age = age;
}

var simplePerson = new SimplePerson(123, 'Foo Bar');
var smartPerson = new SmartPerson(123, 'Foo Bar');

console.log(simplePerson, smartPerson)

关于javascript - 为什么在JS中使用getter/setter而不是直接访问属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58010193/

相关文章:

java - 逐字遍历句子

java - 理解for循环逻辑

javascript - 双弧形状与 CSS jquery 或 javascript

javascript - Font Awesome CSS 伪元素

javascript - 从数组生成随机值

Javascript - 使用索引数组访问数组元素

javascript - 当保存的文件被覆盖/替换时, Electron 窗口会重新加载

java - 检查数组的长度并检查 HashMap 键是否在 HashMap 中(Java、Arrays、HashMap)

算法:确定由任意路径描绘的两个扇形的形状,然后填充其中一个

javascript - 如何在JavaScript中比较像 "x != a OR b"?