Proxy.handler.defineProperty
Proxy.handler.defineProperty
handler.defineProperty()
用于拦截对对象的 Object.defineProperty()
操作。
语法
var p = new Proxy(target, {
defineProperty: function(target, property, descriptor) {
}
}
参数
下列参数将会被传递给defineProperty
方法。this
绑定在 handler 对象上。
target
目标对象。
返回值
defineProperty
方法必须以一个Boolean
返回,表示定义该属性的操作成功与否。
描述
handler.defineProperty()
用于拦截对对象的Object.defineProperty()
操作。
拦截
该方法会拦截目标对象的以下操作 :
Object.defineProperty()
Reflect.defineProperty()
不变量
如果违背了以下的不变量,proxy会抛出TypeError
:
- 如果目标对象不可扩展, 将不能添加属性。
- 不能添加或者修改一个属性为不可配置的,如果它不作为一个目标对象的不可配置的属性存在的话。
- 如果目标对象存在一个对应的可配置属性,这个属性可能不会是不可配置的。
- 如果一个属性在目标对象中存在对应的属性,那么
Object.defineProperty(target, prop, descriptor)
将不会抛出异常。
- 在严格模式下,
false
作为handler.defineProperty
方法的返回值的话将会抛出TypeError
异常.
示例
以下代码演示如何拦截对目标对象的Object.defineProperty()
操作。
var p = new Proxy{}, {
defineProperty: function(target, prop, descriptor) {
console.log('called: ' + prop
return true;
}
}
var desc = { configurable: true, enumerable: true, value: 10 };
Object.defineProperty(p, 'a', desc // "called: a"
When calling Object.defineProperty()
or Reflect.defineProperty()
, the descriptor
passed to defineProperty
trap has one restriction - only following properties are usable, nonstandard properties will be ignored:
enumerable
configurable
writable
value
get
set
var p = new Proxy{}, {
defineProperty(target, prop, descriptor) {
console.log(descriptor
return Reflect.defineProperty(target, prop, descriptor
}
}
Object.defineProperty(p, 'name', {
value: 'proxy',
type: 'custom'
} // { value: 'proxy' }
规范
Specification | Status | Comment |
---|---|---|
ECMAScript 2015 (6th Edition, ECMA-262)The definition of '[DefineOwnProperty]' in that specification. | Standard | Initial definition. |
ECMAScript 2017 Draft (ECMA-262)The definition of '[DefineOwnProperty]' in that specification. | Draft | |
浏览器兼容性
Feature | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
Basic support | ? | 18 (18) | ? | ? | ? |
Feature | Android | Chrome for Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|
Basic support | ? | ? | 18.0 (18) | ? | ? | ? |