JS Proxy defineProperty()

🌙
手机阅读
本文目录结构

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(),传递给 definePropertydescriptor   有一个限制 - 只有以下属性才有用,非标准的属性将会被无视 :

  • 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

另见

AXIHE / 精选资源

浏览全部教程

面试题

学习网站

前端培训
自己甄别

前端书籍

关于朱安邦

我叫 朱安邦,阿西河的站长,在杭州。

以前是一名平面设计师,后来开始接接触前端开发,主要研究前端技术中的JS方向。

业余时间我喜欢分享和交流自己的技术,欢迎大家关注我的 Bilibili

关注我: Github / 知乎

于2021年离开前端领域,目前重心放在研究区块链上面了

我叫朱安邦,阿西河的站长

目前在杭州从事区块链周边的开发工作,机械专业,以前从事平面设计工作。

2014年底脱产在老家自学6个月的前端技术,自学期间几乎从未出过家门,最终找到了满意的前端工作。更多>

于2021年离开前端领域,目前从事区块链方面工作了