I have a logic that need to reactively run some function
if a this.variableName
is changed inside or outside the class
the problem is with this logic, getter doesn’t work, and I get undefined
.
not only this, but also maximum stack error.
because is like: set the this
inside the setter, that re-set the this
, that re-call another time the setter, that set the this, and so on… (but this isn’t what I meant)
Semplified version, without parameters, and so, just the minimal example of the bug.
class MyClass {
constructor() {
this.isOn = false;
}
set isOn(value) {
this.isOn = value;
// another functions that do stuff. you can put here a bunch of console.logs if you want just for the demo
}
// the idea is another, but i will show you the simpliest method, I could imagine, just to make you get the idea
turnOn() {
this.isOn = true;
}
turnOff() {
this.isOn = false;
}
// using this approach,
// I don't need to copy paste the same functions in this 2 methods,
// so I just need to care about the var,
// without using a imperative approach,
// but a declarative approach
}
I know we can use _isOn,
but this is literally the opposite of what we want,
because I want the setter to be the same name of the getter,
and still do the logic on setter.hope you get my idea. thanks
2
Answers
You can use private properties
As Konrad has commented, you cannot reference two distinct objects with one identifier. Instead, you could use internal members when referencing from inside.
Alternatively, if we separate the data from the class, we could instance two objects: One where changing the data (e.g. through a proxy) has a side-effect, and the other that changes directly.
Example:
Here, we have two objects of class
Lamp
that act on the same data, one of them through a proxy. The proxiedLamp
‘s methods will cause side-effects.This allows for one implementation for the behaviour (one
Lamp
class), and one set of data. The proxy allows for controlling access and (as you wanted) causing side-effects when accessing.