JavaScript中如何动态设置对象属性?替代eval的优化方案
如何安全地动态设置JavaScript对象属性(替代eval)
你说得对,eval确实存在安全风险——如果params里传入了恶意构造的属性名或值,很可能会执行意料之外的代码,而且eval的性能表现也不如直接操作对象属性的方式。针对你的场景,有几种更安全、更优雅的替代方案:
1. 使用对象方括号属性访问语法(最直接的替代)
你完全不需要依赖eval来设置属性,JavaScript原生支持方括号属性访问语法,可以直接通过属性名字符串操作对象属性,这是最安全且高效的方式:
this.init = function(parent, params){ var that = this; this.parent = parent; // 用方括号直接访问属性,替代eval $.each(params, function(i, val){ that[i] = val; }) return this; };
原理很简单:i是你要设置的属性名(字符串类型),that[i]就等同于直接写that.width、that.height这类代码,赋值操作完全安全,不会有eval带来的代码注入风险。
2. 使用Object.assign简化代码(更简洁的ES6+方案)
如果你的运行环境支持ES6+(现在绝大多数浏览器和Node.js版本都支持),可以用Object.assign一步完成属性合并,连循环都省了:
this.init = function(parent, params){ this.parent = parent; // 把params的所有可枚举属性合并到当前实例 Object.assign(this, params); return this; };
Object.assign会自动把params里的属性复制到this对象上,效果和你之前的循环逻辑完全一致,但代码更简洁易读,维护成本更低。
额外提示:修复调用代码的语法错误
你的调用代码里有个小问题——参数对象里用了分号分隔属性,这会触发语法错误:
// 错误写法(分号需改为逗号) mc = new Monitor( $("#monitors"), { "width":800; "height":600, } ); // 正确写法 mc = new Monitor( $("#monitors"), { "width":800, "height":600 } );
修改后代码就能正常运行了。
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

