转 - get 函数

351 阅读2分钟

get语法将对象属性绑定到查询该属性时将被调用的函数。

描述

有时需要允许访问返回动态计算值的属性,或者你可能需要反映内部变量的状态,而不需要使用显式方法调用。在JavaScript中,可以使用 getter 来实现。虽然可以使用 getter 和 setter 来创建一个伪属性类型,但是不可能同时将一个 getter 绑定到一个属性并且该属性实际上具有一个值。

使用get语法时应注意以下问题:

  • 可以使用数值或字符串作为标识;
  • 必须不带参数;
  • 它不能与另一个 get 或具有相同属性的数据条目同时出现在一个对象字面量中(不允许使用 { get x() { }, get x() { } } 和 { x: ..., get x() { } })。

可通过 delete 操作符删除 getter

举例:

  1. 在新对象初始化时定义一个getter
var obj = {
  log: ['a', 'b', 'c'],
  get first(){
      return 'a'
  }
  get latest() {
    if (this.log.length == 0) {
      return undefined;
    }
    return this.log[this.log.length - 1];
  }
}


console.log(obj[first]); // expected output: "a"
console.log(obj.latest); // expected output: "c"
  1. 使用delete操作符删除 getter
delete obj.latest;
  1. 使用计算属性名
var expr = 'foo';

var obj = {
  get [expr]() { return 'bar'; }
};

console.log(obj.foo); // "bar"

Smart / self-overwriting / lazy getters

Getters 给你一种方法来定义一个对象的属性,但是在访问它们之前不会计算属性的值。 getter 延续计算值的成本,直到需要值,如果不需要,您就不用支付成本。

一种额外的优化技术是用智能或记忆化 getters 延迟属性值的计算并将其缓存以备以后访问。该值是在第一次调用getter 时计算的,然后被缓存,因此后续访问返回缓存值而不重新计算它。这在以下情况下很有用:

  • 如果属性值的计算是昂贵的(占用大量RAM或CPU时间,产生工作线程,检索远程文件等)。
  • 如果现在不需要该值。它将在稍后使用,或在某些情况下它根本不使用。
  • 如果被使用,它将被访问几次,并且不需要重新计算该值将永远不会被改变,或者不应该被重新计算。

这意味着你不应该为你希望更改其值的属性使用懒 getter,因为 getter 不会重新计算该值。