get()方法用于拦截某个属性的读取操作,如果没有该属性的时候会报一个undefined的,如果结果get处理会返回对应的错误信息
var person = { name: " 张三 " }; var proxy = new Proxy(person, { get: function(target, property) { if(property in target) { return target[property]; } else { throw new ReferenceError("Property \"" + property + "\" does not exist."); } } }); proxy.name // " 张三 " proxy.age // 抛出一个错误set() 方法用来拦截某个属性的赋值操作。
假定Person对象有一个age属性, 该属性应该是一个不大于 200 的整数, 那么可以使用Proxy保证age的属性值符合要求
let 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'); } } // 对于 age 以外的属性,直接保存 obj[prop] = value; } }; let person = new Proxy({}, validator); person.age = 100; person.age // 100 person.age = 'young' // 报错 person.age = 300 // 报错