Reflect.set不按预期工作

5

我发现跨浏览器的显著错误似乎不太可能。但根据Reflect.set文档,第四个参数应该用作thisArg(例如,如果设置变量是一个setter)。第一个参数是要设置值的对象,然而无论我提供什么对象作为第四个参数,值都会被设置在那个对象上,而不是目标对象。

var target = new Object;
var thisArg = new Object;

Reflect.set(target, 'variable', 52, thisArg);

target.variable == undefined
thisArg.variable == 52

有什么解释吗?

2
在我看来,它似乎按预期工作:ECMAScript 2015 - 9.1.9 [[SET]]( P, V, Receiver ) - 步骤 4d + 5f - Andreas
我不太理解其中的许多内容,但这会令人困惑。例如,Reflect.get功能与MDN上描述的一样:从目标对象中读取,并使用接收器作为thisArg。 - John Smith
Chrome可能仍需要-webkit-标志。 - serkan
正如Andreas所说,这是规范中定义的正确行为。您还需要什么其他信息?[[Get]]的工作方式不同。如果属性是getter,则仅在此处使用接收器:https://www.ecma-international.org/ecma-262/6.0/#sec-ordinary-object-internal-methods-and-internal-slots-get-p-receiver - Felix Kling
1个回答

2

第一个参数是要设置值的对象

不完全正确。第一个参数是调用其setter的对象(包括原型链上的对象)。

无论我提供任何对象作为第四个参数,值都会设置在该对象上而不是目标对象上。

是的。因为属性 总是 设置在接收器上。只是该参数是可选的,因为通常与目标相同,因此当未提供时默认为第一个参数。


我猜MDN页面可能是错的,它说目标是设置值的对象。这确实非常令人困惑。不过你是对的,虽然所有正常的值写入都会转发到接收器(如果指定),但似乎getter和setter在目标中被调用(接收器作为thisArg,完全颠倒了)。 - John Smith
@JohnSmith 我看不出有什么颠倒的地方。位于目标对象中的getter和setter也会在接收者上执行所有的写入操作。 - Bergi
我猜只是有点困惑,Reflect.get 从目标对象中读取,而 Reflect.set 则向接收者对象写入。如果 Reflect.get 调用的目标对象没有 getter 或 setter,那么接收者对象将被完全忽略,只是可选地指定 thisArg,以防任何 getter 被调用。另一方面,如果 Reflect.set 不包含任何 setter,它可以完全忽略目标对象,接收者对象才是真正的“目标”。 - John Smith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接