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/