handler.defineProperty()
用于拦截对对象的 Object.defineProperty()
操作。
var p = new Proxy(target, {
defineProperty: function(target, property, descriptor) {
}
});
下列参数将会被传递给 defineProperty
方法。 this
绑定在 handler 对象上。
target
property
descriptor
defineProperty
方法必须以一个 Boolean
返回,表示定义该属性的操作成功与否。
handler.defineProperty()
用于拦截对对象的 Object.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"
当调用 Object.defineProperty()
或者 Reflect.defineProperty()
,传递给 defineProperty
的 descriptor
有一个限制 - 只有以下属性才有用,非标准的属性将会被无视 :
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) [[DefineOwnProperty]] |
Standard | Initial definition. |
ECMAScript Latest Draft (ECMA-262) [[DefineOwnProperty]] |
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) | ? | ? | ? |