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
有一个限制,只有以下属性才有用,非标准的属性将会被无视:
enumerable
configurable
writable
value
get
set
const 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' }