handler.defineProperty() 方法主要用于拦截 Object.defineProperty() 操作。
const proxy = new Proxy(target, {defineProperty: function (target, property, descriptor) {// do something},});
| 参数 | 说明 | 类型 |
|---|---|---|
target | 目标对象 | object |
property | 待检索其描述的属性名 | string |
descriptor | 待定义或修改的属性的描述符 | string |
该方法会拦截目标对象的以下操作:
Object.defineProperty()Reflect.defineProperty()proxy.property = 'value'如果违背了以下的约束,proxy 会抛出 TypeError 异常:
Object.defineProperty(target, prop, descriptor) 将不会抛出异常false 作为 handler.defineProperty 方法的返回值的话将会抛出 TypeError 异常以下代码演示如何拦截对目标对象的 Object.defineProperty() 操作:
const proxy = new Proxy({},{defineProperty: function (target, prop, descriptor) {console.log('Called: ' + prop);return true;},});const desc = {configurable: true,enumerable: true,value: 10,};Object.defineProperty(proxy, 'a', desc);// "Called: a"
当调用 Object.defineProperty() 或者 Reflect.defineProperty(),传递给 defineProperty 的 descriptor 有一个限制,只有以下属性才有用,非标准的属性将会被无视:
enumerableconfigurablewritablevaluegetsetconst proxy = new Proxy({},{defineProperty(target, prop, descriptor) {console.log(descriptor);return Reflect.defineProperty(target, prop, descriptor);},});Object.defineProperty(proxy, 'name', {value: 'proxy',type: 'custom',});// { value: 'proxy' }