当前位置:   article > 正文

ES6入门---第三单元 模块七: Proxy的使用+Reflect的使用_const dom = new proxy({} { get(target property)

const dom = new proxy({} { get(target property) { return function(attrs

proxy:  代理
    扩展(增强)对象、方法(函数)一些功能

    比如: 
        Vue

        Vue.config.keyCodes.enter=65

    Proxy作用: 比如vue中拦截
        预警、上报、扩展功能、统计、增强对象等等

    proxy是设计模式一种,  代理模式

 


语法:
    new Proxy(target, handler);
    let obj = new Proxy(被代理的对象,对代理的对象做什么操作)

handler:

    {
        set(){},  //设置的时候干的事情
        get(){},  //获取干的事情
        deleteProperty(){},  //删除
        has(){}  //问你有没有这个东西  ‘xxx’ in obj
        apply()  //调用函数处理
        .....
    }


  1. let obj = {
  2. name:'Strive'
  3. };
  4. let newObj = new Proxy(obj,{//代理obj
  5. get(target, property){//property 属性 get是获取信息
  6. //console.log(target, property);
  7. //TODO
  8. console.log(`您访问了${property}属性`);
  9. return target[property];//没有return返回值会都出现undefined
  10. }
  11. });
  12. console.log(newObj.name);


实现一个,访问一个对象身上属性,默认不存在的时候给了undefined,希望如果不存在错误(警告)信息:

  1. let newObj = new Proxy(obj, {
  2. get(target, property){
  3. if(property in target){
  4. return target[property];
  5. }else{
  6. //throw new ReferenceError(`${property}属性不在此对象上`);
  7. console.warn(`${property}属性不在此对象上`);
  8. return '^_^';//替换了出现的undefined
  9. }
  10. }
  11. });


DOM.div()
DOM.a();
DOM.ul()

例:

  1. <script>
  2. const DOM = new Proxy({},{
  3. get(target, property){
  4. //console.log(target, property);
  5. //property就是DOM.xxx 里面的xxx
  6. return function(attr={}, ...children){//json的内容,其他内容
  7. //console.log(attr, children);
  8. const el = document.createElement(property);
  9. //添加属性
  10. for(let key of Object.keys(attr)){
  11. el.setAttribute(key, attr[key]);
  12. }
  13. //添加子元素
  14. for(let child of children){
  15. if(typeof child == 'string'){
  16. child = document.createTextNode(child);//创建文本节点
  17. }
  18. el.appendChild(child);//添加
  19. }
  20. return el;
  21. }
  22. }
  23. });
  24. let oDiv = DOM.div({id:'div1',class:'aaa'},'我是div','呵呵呵');//json,内容,……
  25. console.log(oDiv);
  26. </script>
  1. const DOM = new Proxy({},{
  2. get(target, property){
  3. //console.log(target, property);
  4. //property DOM.xxx 里面的xxx
  5. return function(attr={}, ...children){
  6. //console.log(attr, children);
  7. const el = document.createElement(property);
  8. //添加属性
  9. for(let key of Object.keys(attr)){
  10. el.setAttribute(key, attr[key]);
  11. }
  12. //添加子元素
  13. for(let child of children){
  14. if(typeof child == 'string'){
  15. child = document.createTextNode(child);
  16. }
  17. el.appendChild(child);
  18. }
  19. return el;
  20. }
  21. }
  22. });
  23. let oDiv = DOM.div(
  24. {id:'div1',class:'aaa'},'我是div','呵呵呵',
  25. DOM.a({href:'http://www.51mmr.net'}, '访问官网'),
  26. DOM.ul({},
  27. DOM.li({},'1111'),
  28. DOM.li({},'2222'),
  29. DOM.li({},'3333'),
  30. DOM.li({},'4444')
  31. )
  32. );
  33. window.onload=function(){
  34. document.body.appendChild(oDiv);
  35. };

set(), 设置,拦截:
    设置一个年龄,保证是整数,且范围不能超过200

  1. let obj =new Proxy({},{
  2. set(target, prop, value){
  3. if(prop == 'age'){
  4. if(!Number.isInteger(value)){
  5. throw new TypeError(`年龄必须为整数`);
  6. }
  7. if(value>200){
  8. throw new RangeError('年龄超标了,必须小于200岁');
  9. }
  10. }
  11. target[prop]=value;
  12. }
  13. });
  14. obj.a=123;
  15. obj.name = 'Strive';
  16. console.log(obj);
  17. obj.age = 201;

deleteProperty(): 删除,拦截:

  1. let json = {
  2. a:1,
  3. b:2
  4. };
  5. let newJson = new Proxy(json, {
  6. deleteProperty(target, property){
  7. console.log(`您要删除${property}属性`);
  8. //TODO
  9. delete target[property];
  10. }
  11. });
  12. delete newJson.a;
  13. console.log(newJson);


has(): 检测有没有

  1. let newJson = new Proxy(json, {
  2. deleteProperty(target, property){
  3. console.log(`您要删除${property}属性`);
  4. //TODO
  5. delete target[property];
  6. },
  7. has(target, property){
  8. console.log(`判断是否存在调用has方法`);
  9. //TODO
  10. return property in target;
  11. }
  12. });
  13. console.log('a' in newJson);

apply(target,context指向,args参数数组)  :拦截方法

  1. function fn(){
  2. return '我是函数';
  3. }
  4. let newFn = new Proxy(fn, {
  5. apply(){
  6. return '函数么?';
  7. }
  8. });
  9. console.log(newFn());


Reflect: 反射

将Object.xxx  语言内部方法如:Object.defineProperty放到Reflect对象身上

通过Reflect对象身上直接拿到语言内部东西

比如:


    'assign' in Object    ->   Reflect.has(Object, 'assign')

    delete json.a        ->   Reflect.deleteProperty(json, 'a');

  1. let json ={a:1, b:2};
  2. /* delete json.a;
  3. console.log(json); */
  4. Reflect.deleteProperty(json, 'a');
  5. console.log(json);


 


Reflect.apply(调用的函数,this指向,参数数组);与fn.call()    fn.apply()  作用类似

  1. let res = Reflect.apply(Math.ceil,null, [9.8]);//变形式调用函数
  2. console.log(res);
  1. function show(...args){
  2. console.log(this);
  3. console.log(args);
  4. }
  5. //show(1,2,3,4);
  6. //show.call('abc', 1,2,3,4);将this改变成abc
  7. //show.apply('abcd',[1,2,3,4]);
  8. Reflect.apply(show, 'aaaa', [1,2,3,4]);

 

  1. function sum(a,b){
  2. return a+b;
  3. }
  4. let newSum = new Proxy(sum, {
  5. apply(target, context, args){
  6. //console.log(target, context, args);
  7. //console.log(...arguments);
  8. return Reflect.apply(...arguments);
  9. }
  10. });
  11. console.log(newSum(2,3))

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/140088
推荐阅读
相关标签
  

闽ICP备14008679号