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

Object.defineProperty抛出TypeError:ES6类不可写属性赋值异常问询

问题原因分析

这个现象的核心是严格模式在不同执行环境下的行为差异,结合你定义的属性特性,咱们一步步理清楚:

1. 先明确test属性的本质

你通过Object.defineProperty给实例添加test属性时,没有显式设置writable: true——根据ES规范,Object.defineProperty的属性描述符默认值里,writable是false。也就是说,这个test属性从一开始就是不可写的,任何尝试修改它的操作本质上都是违规的。

2. 两种赋值场景的执行环境差异

场景1:全局作用域直接赋值c.test = 10

Node.js的全局作用域默认是非严格模式。在非严格模式下,ES规范允许对不可写属性的赋值操作静默失败——不会抛出错误,也不会修改属性值,所以你看到控制台输出的test还是100。

场景2:调用类方法c.setTest(20)赋值

ES6类的所有方法(包括构造函数、原型方法)内部都是强制启用严格模式的,哪怕你没手动添加'use strict'声明也一样。在严格模式下,ES规范要求对不可写属性的赋值操作必须抛出TypeError,所以这里直接报错了。

额外验证小提示

如果在全局作用域开头加上'use strict',再执行c.test = 10,你会发现同样会抛出TypeError,这也能印证严格模式的影响。

内容的提问来源于stack exchange,提问作者Cliff Stanford

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:43:13