UNPKG

@web-native-js/observer

Version:

A simple set of functions for intercepting and observing JavaScript objects and arrays.

50 lines (47 loc) 1.24 kB
/** * @imports */ import _arrFrom from '@webqit/util/arr/from.js'; import _get from '../interceptor/get.js'; import _set from '../interceptor/set.js'; /** * Initializes "Reflxive getter/setter" traps on the subject. * * @param array|object subject * @param string|array keys * * @return void */ export default function(subject, keys) { _arrFrom(keys).forEach(key => { var value = subject[key], onGetFire, onSetFire; var currentDescriptor = Object.getOwnPropertyDescriptor(subject, key) || {enumerable: key in subject ? 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 = _get(subject, key); onGetFire = false; return _value; }; currentDescriptor.set = newValue => { if (onSetFire) { value = newValue; return true; } onSetFire = true; var rspns = _set(subject, key, newValue); onSetFire = false; return true; }; Object.defineProperty(subject, key, currentDescriptor); }); }