更优雅安全的JavaScript对象路径引用传递实现方案
替代实现方案
你现有方案的核心问题是依赖eval执行动态代码,不仅有安全隐患,还硬绑定了全局object变量,复用性极低,也不符合SICP提到的抽象隐藏原则。
下面是符合你需求的消息传递/高阶函数实现,全程不需要字符串拼接和eval:
完整属性访问器方案
这个方案会返回一个封装了所有路径操作的闭包对象,使用者只需要调用暴露的方法即可,完全不需要感知内部绑定的对象和属性:
const myObject = { prop1: "sth", prop2: "sthelse" }; function getPath(targetObj, propName) { // 所有内部细节全部隐藏,仅对外暴露操作方法 return { // 获取属性值 get: () => targetObj[propName], // 赋值属性 set: (newVal) => targetObj[propName] = newVal, // 删除属性 delete: () => delete targetObj[propName], // 你提到的「以自身为入参调用参数」的方法,可接收任意高阶处理函数 apply: (handler) => handler(this) } } // 高阶函数直接接收访问器对象作为参数 function deleteProp(pathAccessor) { console.log(pathAccessor.get()); // 输出要删除的属性值:sth pathAccessor.delete(); console.log(myObject); // 输出 { prop2: 'sthelse' } } deleteProp(getPath(myObject, "prop1"));
轻量单操作方案
如果你只需要传递单一操作的能力,不需要完整的访问接口,可以直接返回对应的操作函数,更简洁:
// 生成删除指定属性的函数,可自由传递,调用时才执行操作 const createDeletePropFn = (targetObj, propName) => () => delete targetObj[propName]; const deleteProp1 = createDeletePropFn(myObject, "prop1"); // 任意传递deleteProp1,不需要担心提前执行 deleteProp1();
方案优势
- 无安全风险:完全避免了
eval的各类问题 - 抽象程度高:符合SICP隐藏实现细节的要求,使用方不需要关心路径对应的具体对象和属性
- 复用性强:支持绑定任意对象的任意属性,不需要修改原有逻辑
- 不会提前解析:传递过程中仅传递封装好的函数/对象,只有主动调用方法时才会执行对应操作,完全解决你提到的提前解析属性值的问题
内容的提问来源于stack exchange,提问作者Wheelwright
相关产品推荐
相关产品推荐

