分享一个常见编程问题的另类解决方案

分享一个常见编程问题的另类解决方案

问题
想象这么一种情景:
你通过某个配置数组,生成了对应的按钮或者交互元素。
然后你希望当用户点击这个按钮的时候,逻辑里可以使用该按钮对应的配置。

如图:


你希望当用户点击item_3的时候,代码是这样子的
image

然而,这是不可行的,毕竟node和button组件不允许你添加自定义属性。

一般解决
目前比较主流的解决方案有:
1.为button元素绑定一个类。
2.把button的name属性利用起来。
即,名字里包含了元素index信息,然后再去截字符串得到index,再回到数组里取conf。
3.绑定事件的时候,在回调函数bind一个属性进去。

其实这些方法都不太完美。

先说1,工作量增加,类也增加,而且作为一个不喜欢绑定做法,更希望全代码做法的开发来说,这是不“优雅”的实现。

方法2呢,目前主流应该是方法2,相对比较便捷,运算也不难,这里我不反对2的做法,毕竟我也是经常用2,只是说“洁癖”的我觉得2始终只能算是个“入侵式”的解决方案,毕竟是把“name”属性的意义给破坏了,所以我认为2只是“没有办法的办法”。

方法3呢,其实我个人特别不推荐,可能是我一直觉得js的闭包和“函数即对象”是js的糟粕,里面水也深,也有内存泄露的风险,所以我个人强烈不推荐,当然大神可以无视,纯个人意见~

新方案
好了废话说完,现在说说一种新的解决方案。
就是WeakMap

还不了解的可以先看看官方的说明
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/WeakMap

简单描述就是,WeakMap和Map有点类似,但WeakMap的key是弱引用,不会影响垃圾回收的引用计数。

实现
然后,我们可以这样设计:

可以看到,button和conf通过一个weakMap绑定了关系,使用时,直接通过button就可以直接读取对应的conf了。

好处
这样的设计,有几个好处
1.没有“入侵性”,不需要强行更改name属性的意义,也不需要改变Node的实现。
2.使用便捷,例子里我用了类属性,实际上项目里大可以写成工具类,直接调即可。
3.不会带来额外的内存泄露风险
即使一个不小心忘记了清空buttonItemMap,由于是弱引用,该回收还是会被回收,可以非常放心地“食用”。

好了,本次分享就到这里,如果觉得有用就…什么也不用做,哈哈哈,毕竟我也没搞什么公众号。

随便顺手贴下我的工具,如果大家喜欢以后有机会再搞点其他有用的工具吧,最近有了些时间。
image
https://store.cocos.com/app/detail/3540

1赞

还有个简单歪点得 法子 btn[“confg”] = xxx 属性随便填,不报错