javascript 和 memoized getters

标签 javascript ecmascript-6 getter-setter getter

This article describe getters .它有一个部分“ 智能/ self 覆盖/懒惰的 setter/getter ” 我不清楚,默认情况下 setter/getter 是“内存”的还是我应该自己实现这个功能

例如

class Foo() {
  get boo() {
    this._boo = this._boo || new Boo(); 
    return this._boo;  
  }
}

或者我可以只写:

class Foo() {
  get boo() {
    return new Boo();  
  }
}

得到相同的结果?

最佳答案

那篇文章最有趣的部分是 Smart / self-overwriting / lazy getters ,它提供了这种技术:

<del>
class Foo {
  get boo() {
    delete this.boo;
    return this.boo = new Boo();
  }
}
</del>

有了这个,您的 Foo 对象就不会经历创建它们的 boo 属性的麻烦,直到您要求它。然后它被创建一次,对它的进一步请求只返回相同的对象。如果 new Boo() 以某种方式创建资源密集型并且通常不需要,那么这是有道理的。

理论上,您可以扩展它以允许您删除当前版本并在下次访问时重新创建它。但这是更多的代码,而且可能是一个相当罕见的需求。

更新

A comment from vrugtehagel正确地指出上述技术虽然适用于普通对象,但不适用于类。

这是一个有效的变体:

class Boo {
  static counter = 0
  constructor () {
    this.x = ++Boo.counter
    console .log (`creating Boo(${this.x})`)
  }
}

class Foo {
  get boo () {
    Object .defineProperty (
      this, 
      "boo", 
      { value: new Boo(), writable: false}
    )
    return this .boo;
  }
}

const f = new Foo()

console .log (f.boo) 
console .log (f.boo) // no 'creating Boo' log, Boo constructor only created once

关于javascript 和 memoized getters,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46832418/

相关文章:

ruby-on-rails - 在 Rails 中获取和设置 json 列键的好方法

javascript - 用于激活从一个 div 切换到另一个 div 的按钮

javascript - 写入 "e && e.preventDefault()"以通过 JsLint 的最佳做法是什么?

javascript - 使用静态 React 函数的返回值

javascript - 使用 ES6 语法导入 jQuery 时出现类型错误

java - POJO 中没有 getter 方法不会通过 setter 方法设置值

javascript - 覆盖setter,并且getter也必须被覆盖

javascript - 在 Dialogflow 中返回 Promise 输出

javascript - 处理 "Switchlike"复选框的模式名称

npm - es2015模式下无法运行全局babel-node