首页 游戏 软件 资讯 排行榜 专题
首页
前端开发
JavaScript属性描述符writable对赋值行为的限制

JavaScript属性描述符writable对赋值行为的限制

热心网友
85
转载
2026-04-26

Ja vaScript属性描述符writable对赋值行为的限制

Ja vaScript属性描述符writable对赋值行为的限制

免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈

在Ja vaScript的对象世界里,给一个属性加上“只读”锁,听起来是个简单的操作。但你真的了解这把锁的精确作用范围吗?今天,我们就来深入聊聊writable: false这个描述符——它远不止“不能改”那么简单。

核心结论先摆在这里:当一个属性的writable被设为false,直接通过赋值操作符(=)去修改它的值,这条路就走不通了。在严格模式下,浏览器会毫不客气地抛出一个TypeError;而在非严格模式下,它则会选择“静默失败”——代码照常运行,不报错,但属性的值纹丝不动。

writable: false 时的赋值表现

这里有个关键细节需要划重点:writable: false限制的仅仅是常规的赋值操作(obj.prop = newValue)。它并不妨碍你通过Object.definePropertyObject.defineProperties这些“元编程”工具去修改属性描述符本身。当然,这么做有个大前提:该属性的configurable描述符必须是true

具体表现,我们可以看几个典型场景:

  • 非严格模式:执行obj.x = 100,控制台风平浪静,但回头检查obj.x,你会发现它还是原来的值。
  • 严格模式:同样的obj.x = 100,会立即触发TypeError: Cannot assign to read only property 'x',赋值被明确拒绝。
  • 试图用defineProperty覆盖:直接调用Object.defineProperty(obj, 'x', { value: 200 })也会失败,除非你同时将writable设为true,或者该属性原本就是configurable: true,允许你先修改描述符。

与 const 声明的区别

很多人容易把writable: falseconst声明混淆。其实,它们守护的“阵地”完全不同。

writable: false对象属性级别的写保护。它锁定的,是某个特定属性的值。而const,是变量(或常量)绑定级别的不可重新赋值。它锁定的,是变量名与那个值(或引用)之间的绑定关系。

举个例子就清楚了:

  • const obj = { x: 1 }; 这里,const意味着你不能让obj这个变量名指向另一个对象(比如obj = {}会报错)。但是,obj.x = 2这个操作完全可行——除非x属性本身被设置了writable: false
  • 反过来,Object.defineProperty(obj, 'x', { value: 1, writable: false })一旦执行,那么无论obj本身是用constlet还是var声明的,obj.x = 2这个赋值操作都会被禁止。

简单说,const管的是“装东西的篮子不能换”,而writable: false管的是“篮子里的某个特定物品不能换”。

如何检测和修改 writable 状态

那么,在实际开发中,我们怎么知道一个属性是不是只读的?又有没有办法“解锁”它呢?

答案是肯定的。使用Object.getOwnPropertyDescriptor(obj, 'prop'),这个方法会返回一个描述符对象,里面清清楚楚地列着writableconfigurableenumerablevalue的当前状态。

至于修改,关键在于另一个描述符:configurable。它的名字已经说明了一切——它决定了属性的配置是否可被更改。

  • 如果configurable: true,那么恭喜,你可以随时通过Object.defineProperty,将writablefalse改回true,从而重新获得赋值权限。
  • 但如果configurable: false,情况就严峻了。这意味着属性被“永久锁定”,它的writable状态(以及其他描述符)再也无法被修改。一个既writable: falseconfigurable: false的属性,就成了一个真正意义上的“铁板一块”。

常见误用场景

最后,我们来看几个开发者常踩的坑。最大的误解莫过于:以为给一个对象设置几个writable: false的属性,就等于“冻结”了整个对象。

事实远非如此。writable: false的保护是精确到单个属性的。

  • 假设对象obj的属性awritable: false,那么obj.a = 1会失败。但这丝毫不影响你给对象新增一个属性bobj.b = 2),或者修改另一个writable: true的属性。
  • 如果你想要的是更全面的保护,Ja vaScript提供了更高级的“封印”方法:

Object.preventExtensions(obj):禁止对象添加新属性。
Object.seal(obj):在preventExtensions的基础上,额外将所有现有属性设为configurable: false(但writabletrue的属性仍可修改值)。
Object.freeze(obj):这是最高级别的“冻结”。它在seal的基础上,进一步将所有自有数据属性的writable设为false。一个被freeze的对象,其结构(不能增删属性)和内容(不能修改值)都被彻底锁定了。

所以,下次当你需要保护对象数据时,先想清楚:你需要的,究竟是给个别贵重物品上锁(writable: false),还是给整个保险箱贴上封条(Object.freeze)?

来源:https://www.php.cn/faq/2297732.html
免责声明: 游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

相关攻略

如何在 JavaScript 中访问数组的第 n 个元素
前端开发
如何在 JavaScript 中访问数组的第 n 个元素

如何在 Ja vaScript 中访问数组的第 n 个元素 本文详解如何通过零基索引准确获取 Ja vaScript 数组中任意位置(如第 3 个)的元素,并纠正常见误区(如 pop() 误传参数),附带可运行示例与关键注意事项。 想从 Ja vaScript 数组里准确拿到第 3 个元素?这事儿听

热心网友
04.26
如何使用 JavaScript 创建多个独立运行的环形进度条
前端开发
如何使用 JavaScript 创建多个独立运行的环形进度条

如何为多个环形进度条绑定独立动画:告别“仅第一个生效”的陷阱 在开发仪表盘或数据看板时,我们常常需要同时渲染多个环形进度条,用来展示像技能掌握度、任务完成率这类指标。但一个常见的“坑”是:代码写完后,只有第一个进度条在动,后面的全都“躺平”了。这问题出在哪?根源往往在于DOM查询和状态管理的方式——

热心网友
04.25
script标签放head还是body_JavaScript加载位置建议【解答】
前端开发
script标签放head还是body_JavaScript加载位置建议【解答】

script标签放head还是body?一个关于时机与风险的决策 关于script标签该放在还是,其实没有唯一的“标准答案”。这更像是一个权衡:你的脚本是否需要访问DOM?它是否依赖页面结构?以及,你愿意为它的加载时机承担多大的渲染阻塞风险?说到底,这不是“哪个更好”,而是“哪个更合适”的问题。 脚

热心网友
04.25
如何利用 Temporal 提案解决 JavaScript 中历史悠久的 Date 时区偏移坑
前端开发
如何利用 Temporal 提案解决 JavaScript 中历史悠久的 Date 时区偏移坑

如何利用 Temporal 提案解决 Ja vaScript 中历史悠久的 Date 时区偏移坑 面对 Ja vaScript 中那个老生常谈的 Date 时区问题,Temporal 提案确实提供了一条出路。但这条路并非简单的“升级”,而是一场彻底的“替换”——你必须放弃所有对 Date 实例的直接

热心网友
04.25
JavaScript中undefined作为局部变量名的潜在风险
前端开发
JavaScript中undefined作为局部变量名的潜在风险

Ja vaScript中undefined作为局部变量名的潜在风险 在函数作用域里,把 undefined 当成局部变量名来用,这事儿听起来好像没什么大不了?但实际情况是,它就像在代码里埋下了一颗隐蔽的地雷——它会悄无声息地覆盖掉该作用域内原本指向全局的 undefined 值。后果是什么?类型判断

热心网友
04.25

最新APP

宝宝过生日
宝宝过生日
应用辅助 04-07
台球世界
台球世界
体育竞技 04-07
解绳子
解绳子
休闲益智 04-07
骑兵冲突
骑兵冲突
棋牌策略 04-07
三国真龙传
三国真龙传
角色扮演 04-07

热门推荐

《红色沙漠》腾空刺击稳定触发技巧-多种方法详解
游戏攻略
《红色沙漠》腾空刺击稳定触发技巧-多种方法详解

红色沙漠腾空刺击稳定触发方法 想在《红色沙漠》里稳定打出帅气的腾空刺击吗?这个技能的关键,在于精准把握那个“完全浮空”的瞬间。简单说,就是在二段跳的最高点,角色身体还在空中、没有任何落地趋势时,按下Shift+右键(PC)或对应的手柄键位。下面这几种方法,能帮你把成功率拉到最高。 基础稳法 这套操作

热心网友
04.26
《红色沙漠》疾风斩观摩位置详解-掌握连招释放技巧
游戏攻略
《红色沙漠》疾风斩观摩位置详解-掌握连招释放技巧

红色沙漠疾风斩观摩位置介绍 想在《红色沙漠》里耍出帅气的疾风斩,第一步不是急着去点技能,而是先“看会了”。这就好比学书法,总得先看看名家是怎么运笔的。游戏里提供了非常直观的观摩机会,让你能把释放时机和节奏看得清清楚楚。 疾风斩观摩位置 核心观摩点就在主城埃尔南德。具体位置,是城东北侧的警卫队训练场,

热心网友
04.26
《杀戮尖塔2》计划妥帖效果详解-能力机制与实用指南
游戏攻略
《杀戮尖塔2》计划妥帖效果详解-能力机制与实用指南

《杀戮尖塔2》中的战术基石:计划妥帖状态详解 在《杀戮尖塔2》的复杂战局中,手牌管理往往是决定胜负的关键。而“计划妥帖”这个可叠加的状态,正是为此而生的核心机制。简单来说,它允许你在每回合结束时,将指定数量的关键卡牌“扣在手里”,带入下一回合。这为那些依赖特定卡牌组合、需要精准规划跨回合战术的构筑,

热心网友
04.26
《红色沙漠》恺利恩采石场解放攻略-详细步骤与BOSS打法
游戏攻略
《红色沙漠》恺利恩采石场解放攻略-详细步骤与BOSS打法

解放《红色沙漠》恺利恩采石场:从清场到斩首的完整战术指南 面对恺利恩采石场那根顽固的100%占领进度条,很多人的第一反应是埋头清怪。但经验告诉我们,和无穷无尽的小兵硬耗,效率实在太低。真正的突破口,在于那三个带着醒目红色标记的关键建筑。拆掉它们,整个战场的难度会陡然降低。 红色沙漠恺利恩采石场解放方

热心网友
04.26
山寨币如何快速查询市场深度与挂单情况?
web3.0
山寨币如何快速查询市场深度与挂单情况?

山寨币如何快速查询市场深度与挂单情况? 对于山寨币交易而言,市场深度与挂单情况绝非可有可无的背景信息,它们直接决定了你交易的滑点大小、成交效率乃至买卖时机。尤其是在那些成交量偏小或波动剧烈的代币上,能否快速读懂订单簿和深度图,几乎成了区分普通玩家与精明交易者的分水岭。接下来,我们就来梳理几种高效的查

热心网友
04.26