美文网首页
es6-proxy(4)

es6-proxy(4)

作者: 吴高亮 | 来源:发表于2019-01-12 22:47 被阅读0次

    接着proxy的属性进行整理

    has

    has就是对in运算符的时候有效;

    let stu1 = {name: '张三', score: 59};
    let stu2 = {name: '李四', score: 99};
    
    let handler = {
      has(target, prop) {
        if (prop === 'score' && target[prop] < 60) {
          console.log(`${target.name} 不及格`);
          return false;
        }
        return prop in target;
      }
    }
    
    let oproxy1 = new Proxy(stu1, handler);
    let oproxy2 = new Proxy(stu2, handler);
    
    'score' in oproxy1
    // 张三 不及格
    // false
    
    'score' in oproxy2
    // true
    
    for (let a in oproxy1) {
      console.log(oproxy1[a]);
    }
    // 张三
    // 59
    
    for (let b in oproxy2) {
      console.log(oproxy2[b]);
    }
    // 李四
    // 99
    

    上面代码中,has拦截只对in运算符生效,对for...in循环不生效,导致不符合要求的属性没有被for...in循环所排除。

    construct()
    construct方法用于拦截new命令,下面是拦截对象的写法。
    construct方法可以接受两个参数。

    target:目标对象
    args:构造函数的参数对象
    newTarget:创造实例对象时,new命令作用的构造函数(下面例子的p)

    var p = new Proxy(function () {}, {
      construct: function(target, args) {
        console.log('called: ' + args.join(', '));
        return { value: args[0] * 10 };
      }
    });
    
    (new p(1)).value
    // "called: 1"
    // 10
    

    deleteProperty()
    deleteProperty方法用于拦截delete操作,如果这个方法抛出错误或者返回false,当前属性就无法被delete命令删除。

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

    上面代码中,deleteProperty方法拦截了delete操作符,删除第一个字符为下划线的属性会报错。

    注意,目标对象自身的不可配置(configurable)的属性,不能被deleteProperty方法删除,否则报错。
    剩余的还有一起其他对对象的操作;每个方式都有拦截;

    Proxy.revocable();

    取消Proxy代理的操作

    let target = {};
    let handler = {};
    
    let {proxy, revoke} = Proxy.revocable(target, handler);
    
    proxy.foo = 123;
    proxy.foo // 123
    
    revoke();
    proxy.foo // TypeError: Revoked
    

    Proxy.revocable方法返回一个对象,该对象的proxy属性是Proxy实例,revoke属性是一个函数,可以取消Proxy实例。上面代码中,当执行revoke函数之后,再访问Proxy实例,就会抛出一个错误。

    Proxy.revocable的一个使用场景是,目标对象不允许直接访问,必须通过代理访问,一旦访问结束,就收回代理权,不允许再次访问。

    ORM方法论基于三个核心原则: 简单:以最基本的形式建模数据。 传达性:数据库结构被任何人都能理解的语言文档化。 精确性:基于数据模型创建正确标准化的结构。 典型地,建模者通过收集来自那些熟悉应用程序但不熟练的数据建模者的人的信息开发信息模型。建模者必须能够用非技术企业专家可以理解的术语在概念层次上与数据结构进行通讯。建模者也必须能以简单的单元分析信息,对样本数据进行处理。ORM专门被设计为改进这种联系。

    相关文章

      网友评论

          本文标题:es6-proxy(4)

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