为什么用Reflect.set修改对象属性没生效?

闲人银银 阅读 34

在用Reflect.set给对象赋值时发现没有变化,但直接用obj.key=新值却可以修改,这是怎么回事?比如:


const obj = { count: 0 };
Reflect.set(obj, 'count', 1);
console.log(obj.count); // 输出1没问题,但...

当我用Object.defineProperty把属性设为writable: false后,再用Reflect.set就完全没反应了,直接赋值会报错,但Reflect.set既不报错也没修改,这是设计的特性吗?

我来解答 赞 4 收藏
二维码
手机扫码查看
1 条解答
シ欣怡
シ欣怡 Lv1
你这个问题是因为 writable: false 的属性在严格模式下是不可修改的,Reflect.set 不会报错但会返回 false 表示设置失败。如果需要强制修改,可以重新定义属性的描述符,比如这样:

const obj = { count: 0 };
Object.defineProperty(obj, 'count', { writable: false });

// 强制修改
Object.defineProperty(obj, 'count', { writable: true });
Reflect.set(obj, 'count', 1);
console.log(obj.count); // 输出1


别折腾太多这种奇怪的需求,代码写得太绕容易给自己挖坑。
点赞 1
2026-02-14 08:07