在线文档教程

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' }

规范

SpecificationStatusComment
ECMAScript 2015 (6th Edition, ECMA-262)The definition of '[DefineOwnProperty]' in that specification.StandardInitial definition.
ECMAScript 2017 Draft (ECMA-262)The definition of '[DefineOwnProperty]' in that specification.Draft

浏览器兼容性

FeatureChromeFirefox (Gecko)Internet ExplorerOperaSafari
Basic support?18 (18)???

FeatureAndroidChrome for AndroidFirefox Mobile (Gecko)IE MobileOpera MobileSafari Mobile
Basic support??18.0 (18)???