mercredi 5 septembre 2018

"How to pass javascript property (name) without using String?" or "How to reflect body of lambda expression"?

  1. I have an object with an attribute "myProperty", having getter and setter ("Property Getters and Setters" are supported since EcmaScript 5: https://www.w3schools.com/js/js_es5.asp):

    var obj = {
      myProperty:'myPropertyValue', 
      get myProperty(){
        return this.property;
      },
      set myProperty(value){
        this.property=value;
      }
    };
    
    
  2. I would like to bind that attribute to a view, which is the task of a custom function that is called bindProperty.

I could do something like

bindProperty(obj, 'myProperty');

However, I would like to avoid to pass the property name as a hard coded String. Strings have the disadvantage, that they are not updated when the attribute name changes during refactoring.

=>How can I pass/identify the property without using a String?

A. Using reflection?

I could imagine something like

bindProperty(obj, ()=>obj.myProperty);

The function bindProperty would then have to do some reflection magic to find out the name of the attribute in the body of the lambda expression (pseudo code):

let attributeName = getNameofArgumentFromBodyOfLambdaExpression(lambda);
obj[attributeName] = 'newValue';

=>Is it possible in JavaScript to evaluate the body of the lambda expression using reflection to get the name of the attribute?

(I know that this can be done in .NET languages, e.g.

Private Sub BindProperty(Of T)(propertyExpression As Expression(Of Func(Of T)))

    Dim propertyName As String = GetPropertyName(propertyExpression)
'...

)

B. Using complex attributes

An alternative whould be that I use wrapping property objects, having their own getters and setters. Howerver, then I would have to use the property like

obj.myProperty.set('newValue')

and I still want to be able to use

obj.myProperty = 'newValue'

Therefore, this is not an option for me and I would prefer to use Strings instead of B.

C. Any other alternatives?





Aucun commentaire:

Enregistrer un commentaire