Question 59
Question
Answer
const observableSymbols = {
observers: Symbol('observers'), // Store observers within the proxy
};
function createObservable(target) {
// Create a Proxy with observer management
return new Proxy(target, {
get(target, prop, receiver) {
// Get property value as usual
return Reflect.get(target, prop, receiver);
},
set(target, prop, newValue, receiver) {
// Set the property value
Reflect.set(target, prop, newValue, receiver);
// Notify observers about the change
for (const observer of target[observableSymbols.observers]) {
observer(prop, newValue, target); // Call observer function with updated data
}
return true;
},
});
}
// Custom `Symbol.iterator` for observable values
function* observableIterator(target) {
for (const key in target) {
yield [key, target[key]];
}
}
// Example Usage:
const myObservable = createObservable({ name: 'Alice', age: 30 });
myObservable[observableSymbols.observers] = []; // Initialize observer list for the proxy
myObservable.age = 35;
// Observer function (registers to listen to changes)
function logChange(prop, newValue, target) {
console.log(`Property ${prop} changed to: ${newValue}`);
}
const observer = logChange;
myObservable[observableSymbols.observers].push(observer); // Register the observer
Last updated