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

免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈
在Ja vaScript的对象世界里,给一个属性加上“只读”锁,听起来是个简单的操作。但你真的了解这把锁的精确作用范围吗?今天,我们就来深入聊聊writable: false这个描述符——它远不止“不能改”那么简单。
核心结论先摆在这里:当一个属性的writable被设为false,直接通过赋值操作符(=)去修改它的值,这条路就走不通了。在严格模式下,浏览器会毫不客气地抛出一个TypeError;而在非严格模式下,它则会选择“静默失败”——代码照常运行,不报错,但属性的值纹丝不动。
writable: false 时的赋值表现
这里有个关键细节需要划重点:writable: false限制的仅仅是常规的赋值操作(obj.prop = newValue)。它并不妨碍你通过Object.defineProperty或Object.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: false和const声明混淆。其实,它们守护的“阵地”完全不同。
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本身是用const、let还是var声明的,obj.x = 2这个赋值操作都会被禁止。
简单说,const管的是“装东西的篮子不能换”,而writable: false管的是“篮子里的某个特定物品不能换”。
如何检测和修改 writable 状态
那么,在实际开发中,我们怎么知道一个属性是不是只读的?又有没有办法“解锁”它呢?
答案是肯定的。使用Object.getOwnPropertyDescriptor(obj, 'prop'),这个方法会返回一个描述符对象,里面清清楚楚地列着writable、configurable、enumerable和value的当前状态。
至于修改,关键在于另一个描述符:configurable。它的名字已经说明了一切——它决定了属性的配置是否可被更改。
- 如果
configurable: true,那么恭喜,你可以随时通过Object.defineProperty,将writable从false改回true,从而重新获得赋值权限。 - 但如果
configurable: false,情况就严峻了。这意味着属性被“永久锁定”,它的writable状态(以及其他描述符)再也无法被修改。一个既writable: false又configurable: false的属性,就成了一个真正意义上的“铁板一块”。
常见误用场景
最后,我们来看几个开发者常踩的坑。最大的误解莫过于:以为给一个对象设置几个writable: false的属性,就等于“冻结”了整个对象。
事实远非如此。writable: false的保护是精确到单个属性的。
- 假设对象
obj的属性a是writable: false,那么obj.a = 1会失败。但这丝毫不影响你给对象新增一个属性b(obj.b = 2),或者修改另一个writable: true的属性。 - 如果你想要的是更全面的保护,Ja vaScript提供了更高级的“封印”方法:
Object.preventExtensions(obj):禁止对象添加新属性。
Object.seal(obj):在preventExtensions的基础上,额外将所有现有属性设为configurable: false(但writable为true的属性仍可修改值)。
Object.freeze(obj):这是最高级别的“冻结”。它在seal的基础上,进一步将所有自有数据属性的writable设为false。一个被freeze的对象,其结构(不能增删属性)和内容(不能修改值)都被彻底锁定了。
所以,下次当你需要保护对象数据时,先想清楚:你需要的,究竟是给个别贵重物品上锁(writable: false),还是给整个保险箱贴上封条(Object.freeze)?
游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。
同类文章
HTML歌词支持同步滚动吗_同步滚动中HTML歌词用法【攻略】
HTML歌词支持同步滚动吗?深入解析实现要点 直接说结论吧:原生 HTML 确实不支持歌词同步滚动,别被 标签误导了——它只是个语义容器,压根没有时间感知能力。真正的同步效果,得靠 Ja vaScript 配合 元素的 ontimeupdate 事件,再加上精细的 DOM 操作才能实现。 解析 LR
HTML OG标签对社交分享有要求吗_HTML OG标签和社交分享对比【解决方案】
必须添加og:title、og:description、og:image三个核心OG标签,否则社交平台分享时标题截断、描述为空、图片模糊或失效;微信尤其严格,仅读OG标签且要求绝对URL、正确响应头与字符限制。 OG标签不加也能分享,但没图没标题没描述 说实话,很多人觉得OG标签不加好像也能把链接分
HTML图片怎么用Tailwind CSS对齐_Tailwind实现图片对齐实用类写法
实现图片水平垂直居中,flex 结合 justify-center 与 items-center 是最可靠的方法,要求父容器设为 flex 且图片为块级元素;Grid 布局中可使用 place-self-center 精准控制单图居中,而 text-center 仅在图片为行内元素且父容器应用该类时
style属性!important在IE8是否被忽略?
style属性!important在IE8是否被忽略? IE8 是否支持 !important 先说一个关键结论:IE8当然支持!important,但这层支持是有明确“地域”限制的。它只在正式的CSS文件,无论是外链还是内部标签里,才认!important这个“令牌”。一旦把!important写
head标签里能放什么_HTML头部元素汇总【汇总】
HTML Head元素深度解析:构建高效可靠的页面头部 HTML Head元素深度解析:构建高效可靠的页面头部 构建一个高性能、体验良好的网页,往往从处理好那个看不见摸不着的 区域开始。这里汇聚了页面的“元指令”,直接决定了浏览器如何解读、渲染和优化你的内容。一个常见的误区是,把这里当成了杂物间,什
- 日榜
- 周榜
- 月榜
1
2
3
4
5
6
7
8
9
10
相关攻略
2015-03-10 11:25
2015-03-10 11:05
2021-08-04 13:30
2015-03-10 11:22
2015-03-10 12:39
2022-05-16 18:57
2025-05-23 13:43
2025-05-23 14:01
热门教程
- 游戏攻略
- 安卓教程
- 苹果教程
- 电脑教程
热门话题

