javascript和已记忆的吸气剂

kha*_*iuk 5 javascript getter getter-setter ecmascript-6

本文介绍吸气剂。它有一个“智能/自我覆盖/惰性获取器”部分,对我来说还不清楚,默认情况下“获取”获取器是“记忆”还是我应该自己实现此功能

例如

class Foo() {
  get boo() {
    this._boo = this._boo || new Boo(); 
    return this._boo;  
  }
}
Run Code Online (Sandbox Code Playgroud)

或者我可以写:

class Foo() {
  get boo() {
    return new Boo();  
  }
}
Run Code Online (Sandbox Code Playgroud)

有相同的结果?

Sco*_*yet 6

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


class Foo {
  get boo() {
    delete this.boo;
    return this.boo = new Boo();
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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

更新

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

这是一个有效的变体:


class Foo {
  get boo() {
    delete this.boo;
    return this.boo = new Boo();
  }
}
Run Code Online (Sandbox Code Playgroud)


Joe*_*lay 5

不,JavaScript 中没有对记忆化 getter 的语言级支持。在您的第二个示例中,每次boo访问时都会创建一个新对象。