@web-native-js/reflex
Version:
Reflex is a reactivity library.
50 lines (47 loc) • 1.24 kB
JavaScript
/**
* @imports
*/
import _arrFrom from '@web-native-js/commons/arr/from.js';
import reflexGet from './get.js';
import reflexSet from './set.js';
/**
* Initializes "Reflxive getter/setter" traps on the target.
*
* @param array|object target
* @param string|array keys
*
* @return void
*/
export default function(target, keys) {
_arrFrom(keys).forEach(key => {
var value = target[key], onGetFire, onSetFire;
var currentDescriptor = Object.getOwnPropertyDescriptor(target, key)
|| {enumerable: key in target ? false/*existing but hidden*/ : true};
if ('value' in currentDescriptor) {
delete currentDescriptor.value;
}
if ('writable' in currentDescriptor) {
delete currentDescriptor.writable;
}
currentDescriptor.get = () => {
if (onGetFire) {
return value;
}
onGetFire = true;
var _value = reflexGet(target, key);
onGetFire = false;
return _value;
};
currentDescriptor.set = newValue => {
if (onSetFire) {
value = newValue;
return true;
}
onSetFire = true;
var rspns = reflexSet(target, key, newValue);
onSetFire = false;
return true;
};
Object.defineProperty(target, key, currentDescriptor);
});
}