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

闲人银银 阅读 62

在用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既不报错也没修改,这是设计的特性吗?

我来解答 赞 8 收藏
二维码
手机扫码查看
2 条解答
宇文子萱
对,这就是设计特性。当属性不是可写的,Reflect.set会静默失败而不是抛错。我一般直接检查属性描述符,要改的话用Object.defineProperty先改成可写:

const obj = {};
Object.defineProperty(obj, 'count', { value: 0, writable: false });
// 要修改前先改成可写
Object.defineProperty(obj, 'count', { writable: true });
Reflect.set(obj, 'count', 1);


省得猜它为啥不生效。
点赞
2026-03-26 08:13
シ欣怡
シ欣怡 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


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