阿西河

所有教程

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

我的收藏

    最近访问  (文章)

      教程列表

      抓包专区
      测试专区

      JS Proxy set()

      handler.set() 方法用于拦截设置属性值的操作

      语法

      var p = new Proxy(target, {
        set: function(target, property, value, receiver) {
        }
      });
      
      

      参数

      以下是传递给set方法的参数,this上下文绑定在handler对象上.

      target

      目标对象。

      property

      被设置的属性名。

      value

      被设置的新值。

      receiver

      最初被调用的对象。通常是proxy本身,但handler的set方法也有可能在原型链上或以其他方式被间接地调用(因此不一定是proxy本身)。

      比如,假设有一段代码执行 obj.name = "jen",obj不是一个proxy且自身不含name属性,但它的原型链上有一个proxy,那么那个proxy的set拦截函数会被调用,此时obj会作为receiver参数传进来。

      返回值

      set方法应该返回一个布尔值,返回true代表此次设置属性成功了,如果返回false且设置属性操作发生在严格模式下,那么会抛出一个TypeError

      描述

      handler.set 方法用于拦截设置属性值的操作。

      拦截

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

      • 指定属性值: proxy[foo] = bar 和 proxy.foo = bar
      • 指定继承者的属性值: Object.create(proxy)[foo] = bar
      • Reflect.set()

      约束

      如果违背以下的约束条件,proxy会抛出一个TypeError:

      • 若目标属性是不可写及不可配置的,则不能改变它的值。
      • 如果目标属性没有配置存储方法,即set方法是undefined的,则不能设置它的值。
      • 在严格模式下,若set方法返回false,则会抛出一个 TypeError 异常。

      示例

      以下代码演示如何捕获属性的设置操作。

      var p = new Proxy({}, {
        set: function(target, prop, value, receiver) {
          target[prop] = value;
          console.log('property set: ' + prop + ' = ' + value);
          return true;
        }
      })
      
      console.log('a' in p);  // false
      
      p.a = 10;               // "property set: a = 10"
      console.log('a' in p);  // true
      console.log(p.a);       // 10
      

      规范

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

      另见

      目录
      目录