美文网首页
ES6-proxy比较重要的方法(2)

ES6-proxy比较重要的方法(2)

作者: 吴高亮 | 来源:发表于2019-01-10 20:14 被阅读0次
  • set 前面讲了get;家下来说set;

set方法用来拦截某属性的赋值操作;可以接受四个参数;依次是目标对象;属性名称,属性值和Prozy实例本身;其中最后一个参数可选;
假定Person对象有一个age属性,该属性应该是一个不大于 200 的整数,那么可以使用Proxy保证age的属性值符合要求。

let validator = {
  set: function(obj, prop, value) {
    if (prop === 'age') {
      if (!Number.isInteger(value)) {
        throw new TypeError('The age is not an integer');
      }
      if (value > 200) {
        throw new RangeError('The age seems invalid');
      }
    }

    // 对于满足条件的 age 属性以及其他属性,直接保存
    obj[prop] = value;
  }
};

let person = new Proxy({}, validator);

person.age = 100;

person.age // 100
person.age = 'young' // 报错
person.age = 300 // 报错

上面代码中,由于设置了存值函数set,任何不符合要求的age属性赋值,都会抛出一个错误,这是数据验证的一种实现方法。利用set方法,还可以数据绑定,即每当对象发生变化时,会自动更新 DOM。

有时,我们会在对象上面设置内部属性,属性名的第一个字符使用下划线开头,表示这些属性不应该被外部使用。结合get和set方法,就可以做到防止这些内部属性被外部读写。

const handler = {
  get (target, key) {
    invariant(key, 'get');
    return target[key];
  },
  set (target, key, value) {
    invariant(key, 'set');
    target[key] = value;
    return true;
  }
};
function invariant (key, action) {
  if (key[0] === '_') {
    throw new Error(`Invalid attempt to ${action} private "${key}" property`);
  }
}
const target = {};
const proxy = new Proxy(target, handler);
proxy._prop
// Error: Invalid attempt to get private "_prop" property
proxy._prop = 'c'
// Error: Invalid attempt to set private "_prop" property

上面代码中,只要读写的属性名的第一个字符是下划线,一律抛错,从而达到禁止读写内部属性的目的。
下面是set方法的四个参数的例子;

const handler = {
  set: function(obj, prop, value, receiver) {
    obj[prop] = receiver;
  }
};
const proxy = new Proxy({}, handler);
proxy.foo = 'bar';
proxy.foo === proxy // true
const handler = {
  set: function(obj, prop, value, receiver) {
    obj[prop] = receiver;
  }
};
const proxy = new Proxy({}, handler);
const myObj = {};
Object.setPrototypeOf(myObj, proxy);

myObj.foo = 'bar';
myObj.foo === myObj // true

上面代码中,设置myObj.foo属性的值时,myObj并没有foo属性,因此引擎会到myObj的原型链去找foo属性。myObj的原型对象proxy是一个 Proxy 实例,设置它的foo属性会触发set方法。这时,第四个参数receiver就指向原始赋值行为所在的对象myObj。

相关文章

  • ES6-proxy比较重要的方法(2)

    set 前面讲了get;家下来说set; set方法用来拦截某属性的赋值操作;可以接受四个参数;依次是目标对象;属...

  • ES6-proxy比较重要的方法(1)

    proxy 代理 元编程两个关键字;用于修改某些操作的默认行为;等同于在语言橙层面做出修改;所以属于一种 元编程;...

  • 时间管理3+1表

    工作中到底是能力比较重要?努力比较重要?还是方法比较重要?能力和努力固然都很重要,但是其实方法更加重要,方法不对,...

  • ES6系列之Proxy

    原文链接 http://blog.poetries.top/2018/12/21/es6-proxy/ 关注公众号...

  • 如何反转1个字符串

    最简单的方法 方法2 方法3 比较笨的方法

  • Blockcanary的使用以及电话冷启动优化实战

    背景:其实优化内存。比较重要的是找到哪方法比较耗时。然后优化它。但是往往找那个方法比较耗时是最麻烦了。最笨的方法就...

  • 产品经理的自我管理

    重点说明: 1. 目标管理中的一些原则比较实用也比较重要,可以重点学习一下SMART原则和PDCA方法。 2. 时...

  • Android View事件分发机制

    首先,我们来看看View中比较重要的几个方法 dispatchTouchEventonTouchListener ...

  • 方法比较

    对比总结 1、09年的通过保边滤波解决 halo artifacts (halo artifacts are ...

  • 今天2个比较重要的收获

    第一是,领导找我谈话聊天,大致意思是认可我的学习能力和思维逻辑,认为我的底层逻辑很不错,是可以长期合作的同事,不用...

网友评论

      本文标题:ES6-proxy比较重要的方法(2)

      本文链接:https://www.haomeiwen.com/subject/ylkzrqtx.html