Отдельный модуль, содержащий различные методы, которые раньше были в Object, но их решили вынести в отдельный модуль. Плюс добавили пару новых плюшек
Возможность переопределить поведение существующих объектов
var p = new Proxy(target, handler);var handler = {
get: function(target, name){
return name in target?
target[name] :
37;
}
};
var p = new Proxy({}, handler);
p.a = 1;
p.b = undefined;
console.log(p.a, p.b); // 1, undefined
console.log('c' in p, p.c); // false, 37let validator = {
set: function(obj, prop, value) {
if (prop === 'age') {
if (!Number.isInteger(value)) {
throw new TypeError('The age is not an integer');
}
if (value > 200) {
throw new RangeError('The age seems invalid');
}
}
// The default behavior to store the value
obj[prop] = value;
}
};
let person = new Proxy({}, validator);
person.age = 100;
console.log(person.age); // 100
person.age = 'young'; // Throws an exception
person.age = 300; // Throws an exceptionfunction makeLogger(obj) {
return Proxy.create({
get: function (target, name) {
console.log('get', name, obj);
return obj[name];
},
set: function (target, nave, val) {
console.log('set', name, obj, value);
obj[name] = val;
return true;
}
}, Object.getPrototypeOf(obj));
}var map = new WeakMap(),
element = document.querySelector(".element");
map.set(element, "Original");
// later
var value = map.get(element);
console.log(value); // "Original"
// later still - remove reference
element.parentNode.removeChild(element);
element = null;
value = map.get(element);
console.log(value); // undefined