阿西河

所有教程

公众号
🌙
阿西河前端的公众号

我的收藏

    最近访问  (文章)

      教程列表

      抓包专区
      测试专区

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

      规范

      SpecificationStatusComment
      ECMAScript 2015 (6th Edition, ECMA-262)[[DefineOwnProperty]]StandardInitial definition.
      ECMAScript Latest Draft (ECMA-262)[[DefineOwnProperty]]Draft

      另见

      目录
      目录