You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何无法给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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 13:04:54