zoukankan      html  css  js  c++  java
  • 详解es6中Proxy代理对象的作用

    在es6中新添加了Proxy,那么它有什么作用啊?Proxy本意为代理,而es6中的Proxy也就是代理对象,那么代理对象感觉听起来很模糊,在这里就解释一下Proxy代理对象的作用。

    Proxy的主要作用就是可以对 对象进行拦截,以及对数据读取、修改的过滤保护。

    我们先利用es3的方式来实现一个需求,现有一数据,内部有name、age、sex三个属性,name、age属性可读可写,但是sex属性只可读,不可写

    分析步骤:

    我们可以定义一个构造函数,内部定义一个data数据,包含这三个属性

    我们还要暴露两个方法,一个get,一个set

    get用来读数据,set用来写数据,在写数据的时候判断,如果想设置sex这个属性,我们就给错误提示

     var Person = function(){
          var data = {
            name:'monkey',
            age:18,
            sex:'男'
          }
          this.get = function(key){
            console.log(key)
            return data[key]
          }
          this.set = function(key,value){
            if(key!=='sex'){
              return data[key] = value
            }else{
              throw '该属性为只读属性'
            }
          }
        }
        var person = new Person;
        var name = person.get('name')
        person.set('sex','女')
        console.log(person.get('sex'))
    

      

    最终输出结果:
    在这里插入图片描述

    我们就实现了,name可读可写,sex却不能修改

    然后我们再利用es5的方式来实现,es5知道defineProperty这个方法的实现就简单很多了

    var person = {
      name:'monkey',
      age:30
    }
    Object.defineProperty(person,'sex',{
      writable:false,
      value:'男'
    })
    person.sex = '女'
    console.log(person.sex)
    

      

    我们通过defineProperty设置sex属性为不可写属性

    在这里插入图片描述
    我们会发现最终结果还是男并没有修改成功

    接下来我们就再利用es6的Proxy来实现

    var person = {
      name:'monkey',
      age:19,
      sex:'男'
    }
    var p1 = new Proxy(person,{
      get(target,key){
        console.log(target)
        console.log(key)
        return target[key]
      },
      set(target,key,value){
        if(key=='sex'){
          throw '不允许修改sex'
        }else{
          target[key] = value
        }
      }
    })
    p1.name
    p1.sex = '女'
    

      

    我们来分析下上面的代码,

    定义了一个person数据

    通过new Proxy得到代理对象p1

    Proxy第一个参数为要拦截的对象,第二个参数为对象,对象内部有get和set方法

    get方法是通过p1读数据的时候会调用,get方法有两个参数,target为目标数据也就是person,key就是通过p1读数据时候的key
    例如上面代码20行读取数据了,就会触发get方法结果如下


    set方法就是当通过p1设置数据的时候会触发,内部有三个形参,第一个还是target,第二个还是key,第三个为value也就是设置的值

    那么我们就可以通过key来判断,如果key为sex就代表你要设置sex就给错误提示

    否则就通过target[key] = value给设置数据

    以上就是Proxy的使用方法了,相对es3和es5而言Proxy感觉还是很好的,因为可以在set里面做更多逻辑的处理等等

  • 相关阅读:
    spring jdbc和spring mybatis没什么很大的区别,为什么要用mybatis优势在哪里
    spring概述及环境搭建
    一些关于使用分区视图的好主意(转)
    正确选择排序提高查询性能(转)
    线程池的原理和连接池的原理
    编程式事务造成的系统频繁Down机的前后
    《Oracle 高效设计》 读书思考标量子查询查询性能讨论
    ORACLE自动备份方法(转)
    Oracle 10gR2 行变列研究
    索引组织表IOT(转)
  • 原文地址:https://www.cnblogs.com/laneyfu/p/11269293.html
Copyright © 2011-2022 走看看