ES5严格模式下同名属性与getter/setter共存是否报错?
ES5严格模式下同名普通属性与getter/setter的冲突问题
在ES5严格模式中,对象字面量里同时定义同名的普通属性和getter/setter方法会直接抛出语法错误。
ES5规范明确规定:严格模式下,对象字面量中不允许出现多个同名的属性定义(无论这些属性是普通数据属性还是访问器属性)。这种设计是为了避免歧义写法,强制开发者明确属性的定义方式。非严格模式下浏览器可能会静默覆盖前面的定义,但严格模式会直接报错阻止代码执行。
针对你提到的几个问题补充说明:
- ES5环境的获取:可以通过几种方式测试ES5代码:使用旧版本Node.js(如0.12.x版本,原生支持ES5且默认不启用ES6特性);或者在Chrome开发者工具中,通过设置禁用ES6+特性;也可以用Babel将代码转译为ES5后在现代环境运行,观察执行结果。
- ES6的差异:ES6放宽了同名属性的限制,允许对象字面量中出现同名定义,后面的属性会覆盖前面的。这也是你测试时不同顺序得到不同结果的原因:
- 示例1中,普通属性
p: 5定义在getter之后,直接覆盖了之前的访问器属性,因此obj.p最终是5。 - 示例2中,处理顺序是先定义getter,再用普通属性覆盖为数据属性,最后定义setter时,会将数据属性转换为访问器属性,但此时getter已经被覆盖丢失,所以读取
obj2.p时因没有对应的getter逻辑,返回undefined。
- 示例1中,普通属性
内容的提问来源于stack exchange,提问作者mishar
相关产品推荐
相关产品推荐

