【问题标题】:Benefit of using 'set' in a property of a object?在对象的属性中使用“set”的好处?
【发布时间】:2018-11-15 04:22:47
【问题描述】:

我正在学习 Codecademy 课程,并编写了以下有效的代码:

let person = {
  _name: 'Lu Xun',
  _age: 137,

set age (newAge) {
    if (typeof newAge === 'number'){
      this._age= newAge;
    } else {
      console.log('Invalid input');
    }
  } 
}

person.age= 22;

console.log(person['_age']);

我开始了解 set 的工作原理,并认为它的工作原理与在 person 对象中定义方法基本相同,只是语法不同。

所以我尝试了一下,调用了 age 方法,使用调用方法的正常方式从对象外部将 22 传递给它。它的工作原理相同。见下文。

let person = {
  _name: 'Lu Xun',
  _age: 137,

age: function (newAge) {
    if (typeof newAge === 'number'){
      this._age= newAge;
    } else {
      console.log('Invalid input');
    }
  } 
}

person.age(22);

console.log(person['_age']);

使用“set”语法有什么好处?即,当正常的函数/方法定义以相同的方式工作时,为什么要使用它?

【问题讨论】:

  • 所以你可以使用=
  • 当您可以一次将属性分配给一个新对象时,为什么要使用对象字面量?这是同一种问题。
  • 这个可能的副本应该包含很好的信息 - JavaScript get/set methods vs. standard methods - Set Documentation 也应该有帮助。是否有好处使用其中一个取决于您,并且很可能取决于个人偏好/主要基于意见。

标签: javascript function methods javascript-objects setter


【解决方案1】:

想象一下,您编写了一个非常庞大的代码,其中很多都访问了这样的变量:

// The object
const person = { age: 12 }
// You access it very often
console.log(person.age);

现在您当然想根据生日来计算年龄。使用方法时,每次使用时都必须将person.age 替换为person.getAge()。这可能需要时间。使用 getter / setter,您只需替换一行即可,一切正常。

如果您认为这不是问题,您可能想查看this java thread。 Java 没有 getter/setter。

【讨论】:

  • 一般来说,如果您决定您的房产现在应该计算它的价值,那么恕我直言,房产不再适合使用。属性不应调用具有可能副作用的函数,而应简单地返回它的当前值。您不想在语义上将属性更改为函数并且不依赖于 set 的隐藏函数调用吗?关于做出改变,看到我们假设一个巨大的项目,我进一步假设有良好的调制和命名空间代码和单元测试,以及能够显示用法和依赖关系的工具,这使得改变变得微不足道,我猜。
  • @nope get age() { return (Date.now() - this.birthday) / (1000 * 60 * 60 * 24 * 365); } 是一种纯粹的 IMO。即使现在的 IDE 很容易找到仍然需要时间重写的用法,并且您的提交会受到这些更改的污染。
  • 根据定义,属性不是每次调用时总是返回相同的结果吗?我知道在幕后使用了一个函数,但它被视为一个属性。无论如何,我想都不是在这里或那里,只是在谈论:) +1 作为解决方案解决了这个问题。关于重构,我总是鼓励它。它确保代码中没有留下任何黑客或解决方法工件,而是只使用经过测试和有意义的代码,但我知道,这是个人喜好。
【解决方案2】:

get/set 语法用于属性,而使用方法只是一种方法。大多数情况下,一个简单的公共变量就足够了,但有时,例如在您的示例中,您希望验证输入以确保它满足您对该值的任何期望。

还要考虑如何调用您的代码以及它的外观。如果您要使用函数来更改值并使用函数来获取值,那么您的代码将如下所示:

var myObject = new CoolObject('some parameter');
myObject.setComment('this is a super cool comment');
console.log(myObject.getComment());

好像你在你的财产上实现了 get/set 函数,它看起来像这样

var myObject = new CoolObject('some parameter');
myObject.comment = 'This is a super cool comment';
console.log(myObject.comment);

归根结底,这实际上并不重要,因为两个代码 sn-ps 都会做完全相同的事情,但是一个更容易阅读并且不会让你被你的同事大喊大叫。请记住,如果您只是公开一个公共变量,则第二个示例不会改变。

【讨论】:

  • however one reads easier and wont get you yelled at by your co-workers. - 并不是真正适用于所有领域的东西,这取决于个人喜好,很大程度上取决于您与谁一起工作/为谁工作。
  • @Nope,你说得对,代码标准确实因商店而异,我想这只是我个人的偏见。
  • 另外,setter 不能在 IE 中使用计算属性:/
猜你喜欢
  • 2011-04-02
  • 1970-01-01
  • 1970-01-01
  • 2017-11-03
  • 1970-01-01
  • 1970-01-01
  • 2019-04-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多