reflect.set 会触发目标对象的 setter,行为同 obj.prop = value;receiver 控制 this 指向,返回布尔值便于判断成功与否,setter 存在时 writable 被忽略。

Reflect.set 会触发目标对象上定义的 setter,行为与使用 obj.prop = value 赋值完全一致。
setter 会被正常调用
当目标对象的某个属性有 setter 时,Reflect.set(target, prop, value, receiver) 会执行该 setter 函数,而不是直接写入属性。receiver 参数决定 this 的指向(默认是 target)。
- 如果 setter 返回 false(且在严格模式下),
Reflect.set返回false,表示赋值失败 - 如果 setter 正常执行或返回非 false 值,
Reflect.set返回true - setter 内部的
this指向由receiver参数控制,不是硬绑定到定义 setter 的对象
receiver 影响 this 绑定
setter 中的 this 不一定等于 target,而是等于传入的 receiver(第三个参数,可选,默认为 target)。这在继承或代理场景中很关键。
- 例如子类实例调用父类 setter,
receiver是子类实例,this 就是子类实例 - 配合
Proxy使用时,常把 proxy 本身作为 receiver,确保 setter 内 this 指向 proxy
和直接赋值行为一致,但返回值更明确
obj.prop = value 在 setter 返回 false 时会静默失败(严格模式下抛 TypeError),而 Reflect.set 总是返回布尔值,便于判断是否成功。
- 非严格模式下:setter 返回 false → 直接赋值无反应,
Reflect.set返回false - 严格模式下:setter 返回 false → 直接赋值抛错,
Reflect.set仍返回false,不抛错
注意不可写属性和 setter 冲突
如果属性同时设置了 writable: false 且定义了 setter,Reflect.set 仍会调用 setter(只要属性可配置或存在 setter)。但若属性既不可写、又无 setter,则返回 false。
- setter 存在时,
writable属性被忽略——赋值逻辑交由 setter 处理 - 仅当无 setter 且
writable: false时,Reflect.set才返回false











