为何无法给JS的document或window对象赋值?如何设置只读属性?
问题解答
一、为什么window.document = null;或window = null;无法赋值?
浏览器内置的window及window.document这类核心属性,其属性描述符被设置为不可写(writable: false),部分属性甚至同时配置了不可修改描述符(configurable: false)。
你可以在控制台执行Object.getOwnPropertyDescriptor(window, 'document')查看具体配置,返回结果会明确显示writable: false——这意味着该属性不允许被重新赋值。非严格模式下赋值操作会静默失败,严格模式下则直接抛出错误。
至于window = null,window作为浏览器全局对象的引用,在全局作用域中被定义为不可重新赋值的变量,因此无法将其覆盖为null。
二、如何设置对象/属性为只读(类似C#的只读属性)?
JavaScript可以通过以下几种方式实现只读属性:
使用
Object.defineProperty()配置属性描述符
通过显式设置writable: false,禁止属性被修改。如果同时设置configurable: false,还能禁止属性被删除或修改描述符:const myObj = {}; // 添加只读属性 Object.defineProperty(myObj, 'readonlyVal', { value: '不可修改的值', writable: false, enumerable: true, configurable: false }); myObj.readonlyVal = '尝试修改'; // 非严格模式静默失败,严格模式报错使用ES6 getter定义只读属性
只定义属性的getter方法,不定义setter,这样赋值操作会被拦截:const myObj = { get readonlyProp() { return '通过getter实现的只读属性'; } }; myObj.readonlyProp = '修改'; // 非严格模式静默失败,严格模式报错注意
const的局限性const声明的变量不可重新赋值,但如果变量指向的是对象/数组,其内部的属性或元素仍可修改:const fixedObj = { name: '张三' }; fixedObj.name = '李四'; // 这是允许的 fixedObj = {}; // 报错,变量本身不可重新赋值
内容的提问来源于stack exchange,提问作者Prajval Gahine
相关产品推荐
相关产品推荐

