首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >ECMAScript 6类中的getters和setters是用来做什么的?

ECMAScript 6类中的getters和setters是用来做什么的?
EN

Stack Overflow用户
提问于 2015-01-30 02:48:49
回答 3查看 84K关注 0票数 110

我对ECMAScript 6类中的getters和setters的意义感到困惑。目的是什么?下面是我引用的一个例子:

代码语言:javascript
复制
class Employee {

    constructor(name) {
        this._name = name;
    }

    doWork() {
        return `${this._name} is working`;
    }

    get name() {
        return this._name.toUpperCase();
    }

    set name(newName){
        if(newName){ 
            this._name = newName;
        }
    }
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-01-30 02:54:57

这些setter和getter允许您直接使用属性(不使用括号)

代码语言:javascript
复制
var emp = new Employee("TruMan1");

if (emp.name) { 
  // uses the get method in the background
}

emp.name = "New name"; // uses the setter in the background

这只是为了设置和获取属性的值。

票数 107
EN

Stack Overflow用户

发布于 2020-04-23 12:04:13

代码语言:javascript
复制
class Employee {

    constructor(name) {
      this._name = name;
    }

    doWork() {
      return `${this._name} is working`;
    }

    get name() {
      // when you get this by employeeInstance.name
      // the code below will be triggered
      // and you can do some logic here
      // just like `console.log` something you want
      console.log('get triggered!')
      return this._name.toUpperCase();
    }

    set name(newName) {
      // the same as `get`
      // when you employeeInstance.mame = 'xxx'
      // the code below will be trigged
      // and you can also do some logic 
      // like here is a `console.log` and `if check`
      console.log('set triggered!')
      if (newName) {
        this._name = newName;
      }
    }
  }

  const employeeInstance = new Employee('mike')
  employeeInstance.name
  employeeInstance.name = '' // this won't be successful, because the `if check`
  console.log(employeeInstance.name)

  // => 
  // get triggered
  // set triggered
  // get triggered
  // MIKE

无论如何,gettersetter就像一个间谍。每次获取或设置属性值时,它都会侦测对象的属性,以便您可以执行某些操作。

票数 9
EN

Stack Overflow用户

发布于 2018-01-05 23:59:26

Java和setter的动机与ES6中的类似概念有本质上的不同。

在Java语言中,getter和setter允许类定义JavaBean。getters和setter的要点在于,它允许bean具有与公共字段隐含的接口完全正交的“接口”。所以我可以有一个不是JavaBean属性的字段"name“,也可以有一个不是字段的JavaBean属性"address”。

通过JavaBean反射,成千上万的框架(例如Hibernate)也可以“发现”Java属性。因此,getter和setter是用于“公开”bean属性的标准方法的一部分。

作为函数的Getters和setter还具有“抽象”实现的价值。它既可以是一个字段,也可以是一个计算(“合成”)值。因此,如果我有一个名为"zipcode“的bean属性,它将以存储字符串的形式开始。现在假设我想将其更改为根据地址/城市/州计算的值?

如果我使用了一个字段,下面的代码就会中断:

代码语言:javascript
复制
      String zipcode = address.zipcode();

但是如果我使用getter,这不会中断:

代码语言:javascript
复制
      String zipcode = address.getZipcode();

JavaScript没有任何像JavaBeans这样的东西。据我所知,GET和SET的预期值仅限于前面提到的“合成”(计算)属性。

但它比java更好,因为Java不允许你兼容地将“字段”转换成方法,而ES6 GET和SET允许这样做。

也就是说,如果我有:

代码语言:javascript
复制
       var zipcode = address.zipcode;

如果我将zipcode从标准对象属性更改为getter,上述代码现在将调用GET函数。

注意,如果我没有在定义中包含GET,这将不会调用zipcode GET方法。相反,它只会将函数zipcode赋值给var。

所以我认为这些是理解Java和JavaScript ES6的getter和setter之间的一些重要区别。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28222276

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档