问题描述
假设我有一个带有方法 calculatePrice
的类,它返回一个值。它还有另一种使用 calculatePrice
的方法:
class SodaCan {
constructor(id,otherArgs) {
this.id = id
// more constructor logic
}
calculatePrice() {
// do some calculations for tax,recycling,whatever
return price;
}
savePricetoDb() {
const price = this.calculatePrice();
database.save(this.id,{ price });
}
}
// in the global scope:
const coke = window.coke = new SodaCan('someId',1.19)
coke.savePricetoDb();
一旦 savePricetoDb
完成执行,就不再有对 price
的引用,所以我的假设是 price
被垃圾收集。但是,coke.id
不会被垃圾回收,因为它是 coke
的一个属性,可在全局范围内使用。如果这是不正确的,请告诉我!
现在假设我们将 calculatePrice
更改为 get 方法,例如 get price
:
class SodaCan {
constructor(id,otherArgs) {
this.id = id
// more constructor logic
}
get price() {
// do some calculations for tax,whatever
return price;
}
savePricetoDb() {
const price = this.price;
database.save(this.id,1.19)
coke.savePricetoDb();
(授予 savePricetoDb
函数实际上不需要说 const price = this.price
,因为它可以只调用 database.save(this.id,{ price: this.price })
)
使用 get
语法,this.price
的结果附加到实例。由于 coke
在全局范围内可用,coke.price
仍然会引用它,并且不会被垃圾收集。对吗?
如果我的假设是正确的,就内存管理而言,这是在类上使用 get
方法的缺点吗?如果我不理解这里的某些内容,或者我的假设不正确,请告诉我。
解决方法
使用 get 语法,将 this.price
的结果附加到实例。
不,不是。 getter 只是让它看起来像值是一个属性,但事实并非如此。每次读取 this.price
时,它都会调用 getter 函数并返回值,就像 calculatePrice()
方法一样。该值未在任何地方附加。
所以如果调用者不在任何地方保存价格,它就会变成垃圾。