js每日一练 第四天

const num = add[1][2][3] + 10 //期望num结果为16

const num = add[1][5][3] + 20 //期望num结果为29

问:如何才能输出num期望结果呢

这是一个典型的动态属性

add[1]明显add是一个对象

这时候我们就可以使代理来解答了

 const add = new Proxy({       

                    _store:0 // 把这里当成累加 

          },{       

                get(target,p,receiver){  //target为代理对象 p为读取的属性 //receiver为代理后的对象add       

                                target._store += +p; // 我们只需要累加他的属性就行了 这里需要转换成数字 不然就成字符拼接了       

                                return receiver; //为啥要返回add 因为add[1][2][3]他是一个链式调用 相当于还是调用的add本身       

            } 

  })

js代理对象是可以和普通数字进行相加的 但是他需要转换

如果上面的代码就这样运行会报错 他说不能将一个Symbole转换成一个数字

Cannot conver a Symbol value to a number at Ojbect.get

这里我们需要注意当add代理对象和数字进行相加的时候 他会传进来个符号(Symbol(Symbol.toPrimitive))这个符号叫做知名符号 这个知名符号表示

将一个对象转换成原始类型的时候他就会调用这个属性 也就意味着我只要给他这个

符号属性就行了

const add = new Proxy({     

              _store:0 // 把这里当成累加 

          },{       

                get(target,p,receiver){  //target为代理对象 p为读取的属性 //receiver为代理后的对象add       

                    if(p === Symbol.toPrimitive){ // 说明在进行原始类型转换 这个符号要求返回一个函数           

                            return ()=>{               

                                    return target._stroe; 然后我们再返回累加的结果就行           

                                }

                            }       

                        target._store += +p; // 我们只需要累加他的属性就行了 这里需要转换成数字 不然就成字符拼接了       

                        return receiver; //为啥要返回add 因为add[1][2][3]他是一个链式调用 相当于还是调用的add本身       

                }

})

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 每日一题 以下哪个会打印出"3"?3.toString() //报错 Uncaught SyntaxError...
    咸小七阅读 413评论 0 0
  • const命令: 声明一个只读常量,一旦声明,声明的值就不能改变 声明的常量和let一样,不可重复声明 本...
    菜菜的小菜鸟阅读 552评论 0 0
  • 1. undefined 和 null 有什么区别? 相似之处: 它们属于 JavaScript 的 7 种基本类...
    耶啵_阅读 291评论 0 0
  • Javascript 客户端脚本语言,用于用户交互 特点: 弱类型 解释型 基于对象 事件驱动 单线程/异步(ca...
    一步丶丿麟阅读 128评论 0 0
  • ECMAScript是1996年网景公司把JavaScript提交给了欧洲计算器制作联合会;版本:97年-1.0;...
    神明sama阅读 409评论 0 0