在对象的属性中使用“set”有什么好处?

问题描述 投票:0回答:3

我正在学习 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']);

我正在了解该集合的工作原理,并认为它本质上与在 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 function methods javascript-objects setter
3个回答
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。


0
投票

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);

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


0
投票

关于 get 和 set 需要考虑的要点:

使用 get 和 set 定义的函数它不是函数,它是属性,例如要注意差异

let x = {
  _prop: 1,
  prop: function(){ return this._prop; }
};

因此,如果您需要使用此函数获取道具,您的代码将是

x.prop(); 

但是当您使用 get 时,该函数将作为属性被调用

let x = {
  _prop: 1,
  get prop(){ return this._prop; }
};

x.prop // this will display 1 no calls 

通过注意这一点,您会知道现在您有函数来访问第一点的 prop 并使其成为 prop,因此在您的代码中您仍然正常使用 x.prop 和 Benfit 函数,该函数可能在访问该值之前执行操作,但实际上目标也可能很好

例如使用 set

const x = {
  _prop: 1,
  set prop(valueComeFromEqual){
      // do any validation or prevent even update of !_prop
      this._prop = valueComeFromEqual;

  }
}

与 get 相同,当我们尝试分配值时,我们不会调用函数,它会像为普通属性分配值一样工作,但能够在分配时进行验证,甚至阻止更新,例如许多编码员在项目上工作,您需要 make确保他们不会创建更新 prop 值的方法,这样您就可以抛出异常,甚至在函数中不执行任何操作,这将保持 prop 值不更改分配值的示例

x.prop = 'this value sent as argument'; 

但需要注意的是,使用下划线不会创建私有属性,开发人员可以直接更改 x._prop 的值,但通常代码应该使用

x.prop
并且永远不要直接触及 x._prop ,因此好处之一是获取并设置更改通过使用函数获取 prop 的方式而不改变在代码中使用它的方式,它仍然是
x.prop
而不是
x.prop()
,分配新值的方式也是
x.prop = 'value';

正如我所说,这对于不需要更新的私有道具很有好处,或者在分配值之前进行验证,以防在获取值之前想要执行操作。

© www.soinside.com 2019 - 2024. All rights reserved.