Пример использования:
У меня есть объект с атрибутом "myProperty", имеющий getter и setter (поддерживаются "Getter and Setters свойства", так как 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;
}
};
Я хотел бы привязать этот атрибут к представлению, которое является задачей пользовательской функции, которая называется bindProperty
.
Чтобы передать свойство myProperty
в функцию , я мог бы сделать что-то вроде
bindProperty(obj, 'myProperty');
Однако я бы хотел избегать передачи имени свойства в виде жестко закодированной строки . Недостатком строк является то, что они не обновляются при изменении имени атрибута во время рефакторинга.
Если бы я использовал
bindProperty(obj, obj.myProperty);
функция будет знать только значение свойства 'myPropertyValue', а не откуда оно берется.
=> Как я могу передать / идентифицировать само свойство без использования строки?
A. Используя отражение?
Я мог бы представить что-то вроде
bindProperty(obj, ()=>obj.myProperty);
Функция bindProperty
затем должна будет выполнить некоторую магию отражения , чтобы узнать имя атрибута в теле лямбда-выражения (псевдокод):
let attributeName = getNameofArgumentFromBodyOfLambdaExpression(lambda);
obj[attributeName] = 'newValue';
=> Возможно ли в JavaScript оценить тело лямбда-выражения, используя отражение, чтобы получить имя свойства?
(я знаю, что это можно сделать на языках .NET, например,
Private Sub BindProperty(Of T)(propertyExpression As Expression(Of Func(Of T)))
Dim propertyName As String = GetPropertyName(propertyExpression)
'...
)
B. Использование сложных атрибутов
Альтернативой может быть использование объектов свойств обтекания, имеющих свои собственные методы получения и установки. Но тогда мне бы пришлось использовать это свойство, например
obj.myProperty.set('newValue')
или
obj.myProperty('newValue') //similar to knockout observables
Я все еще хочу иметь возможность использовать отличную функцию Getter / Setter. Другими словами: я хочу использовать свои свойства как простые атрибуты:
obj.myProperty = 'newValue'
Поэтому для меня это не вариант, и я бы предпочел использовать строки вместо B.
C. Любые другие альтернативы?