IE11文档模式5下JavaScript对象静态,如何获取动态JavaScript对象?
解决IE11文档模式5下无法动态修改JavaScript对象的问题
首先得揪出问题的根源:你看到的控制台提示「当前页面目标文档模式为5」是核心——IE的文档模式5是模拟IE5的运行环境,它的JavaScript引擎遵循非常老旧的ES3规范,而且对对象字面量的处理有特殊限制:用{a:5,b:6}这种对象字面量创建的对象,在IE5模式下默认是不可扩展的,所以你没法给它动态添加新属性,才会弹出「object does not support this property」的错误。
下面给你两个解决方案,按优先级排序:
1. 切换到更高版本的文档模式(推荐)
这是最根本的解决办法,因为文档模式5几乎没有必要在现代场景下使用。操作步骤很简单:
- 打开IE11的F12开发者工具(按F12快捷键)
- 切换到「仿真」(Emulation)标签页
- 在「文档模式」下拉菜单里选择「IE11」(或者至少IE8及以上版本)
- 刷新页面后,再用对象字面量创建对象,就能正常动态添加属性了:
var a = {a:5,b:6}; a.l = 6; // 现在不会报错了
2. 若必须保留文档模式5,改用构造函数创建对象
如果你因为特殊需求必须留在IE5模式,那可以放弃对象字面量,改用构造函数来创建可扩展的对象:
// 定义一个构造函数 function MyObj(a, b) { this.a = a; this.b = b; } // 实例化对象 var a = new MyObj(5, 6); // 动态添加属性,此时就能成功了 a.l = 6; console.log(a.l); // 输出6
原因是:在IE5模式下,通过new关键字实例化的构造函数对象是基于原型链创建的,默认支持扩展新属性,而对象字面量创建的对象被引擎标记为不可扩展。
额外提醒:文档模式5下很多现代JavaScript特性都不支持,比如Object.defineProperty、数组的forEach方法等,如果不是必须兼容极古老的页面,强烈建议切换到更高版本的文档模式。
内容的提问来源于stack exchange,提问作者MUY Belgium
相关产品推荐
相关产品推荐

