首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Proxy.handler.defineProperty

handler.defineProperty() 用于拦截对对象的 Object.defineProperty() 操作。

语法

代码语言:javascript
复制
var p = new Proxy(target, {
  defineProperty: function(target, property, descriptor) {
  }
});

参数

下列参数将会被传递给defineProperty方法。this绑定在 handler 对象上。

target目标对象。

property待检索其描述的属性名。

descriptor待定义或修改的属性的描述符。

返回值

defineProperty方法必须以一个Boolean返回,表示定义该属性的操作成功与否。

描述

handler.defineProperty()用于拦截对对象的Object.defineProperty()操作。

拦截

该方法会拦截目标对象的以下操作 :

  • Object.defineProperty()
  • Reflect.defineProperty()

不变量

如果违背了以下的不变量,proxy会抛出TypeError:

  • 如果目标对象不可扩展, 将不能添加属性。

  • 不能添加或者修改一个属性为不可配置的,如果它不作为一个目标对象的不可配置的属性存在的话。

  • 如果目标对象存在一个对应的可配置属性,这个属性可能不会是不可配置的。

  • 如果一个属性在目标对象中存在对应的属性,那么 Object.defineProperty(target, prop, descriptor) 将不会抛出异常。

  • 在严格模式下, false 作为 handler.defineProperty 方法的返回值的话将会抛出 TypeError 异常.

示例

以下代码演示如何拦截对目标对象的Object.defineProperty()操作。

代码语言:javascript
复制
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
代码语言:javascript
复制
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)

?

?

?

扫码关注腾讯云开发者

领取腾讯云代金券

http://www.vxiaotou.com