In JavaScript there is the possibility to create getters and setters the following way:
function MyClass(){ var MyField; this.__defineGetter__("MyField",function(){ return MyField; }); this.__defineSetter__("MyField",function(value){ MyField = value; }); } But is there a way to get the Getter or Setter FUNCTION? I think of something like this:
var obj = new MyClass(); obj.__getSetter__("MyField")("MyValue"); I need such a functionality when extending base classes. For example: Class "A" has field "a", Class "B" extends from "A" and also wants to have a field "a". To pass values from the "a"-field of a "B"-object to the "a"-field of a "A"-object I need to get the setter/getter function before overriding them.
__defineGetter and __defineSetter__ have been deprecated in the time since this question was initially posted.
Accessing those accessor and mutator functions was handled with __lookupGetter__ and __lookupSetter__ respectively.
function MyClass() { var MyField this.__defineGetter__("MyField",function(){ return MyField }) this.__defineSetter__("MyField",function(value){ MyField = value }) } var obj = new MyClass() obj.__lookupSetter__("MyField")("MyValue") console.log(obj.MyField) The current standard way to create a dynamic accessor or mutator is to use Object.defineProperty or Object.defineProperties.
Accessing accessor and mutator functions can be done using Object.getOwnPropertyDescriptor and Object.getOwnPropertyDescriptors.
function MyClass() { let MyField Object.defineProperty(this, 'MyField', { get: () => MyField, set: value => { MyField = value } }) } var obj = new MyClass() Object.getOwnPropertyDescriptor(obj, 'MyField').set('MyValue') console.log(obj.MyField) Note that Object.getOwnPropertyDescriptor works even when using get and set keywords, however there are a couple gotchas if you're using the class keyword.
Accessors and mutators defined on a class are not "own properties" of the instances of that class. Instead they belong to the prototype for that class (class is just syntactic sugar for declaring a prototype).
Because the functions added to the class are added to the prototype you will need to be careful about context when calling the getter or setter.
class MyClass { get MyField() { return this._myField } set MyField(value) { this._myField = value } } const obj = new MyClass() Object.getOwnPropertyDescriptor(MyClass.prototype, 'MyField').set.call(obj, 'MyValue') console.log(obj.MyField) If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With