Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/455.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Reflect.set未按预期工作_Javascript_Ecmascript 6 - Fatal编程技术网

Javascript Reflect.set未按预期工作

Javascript Reflect.set未按预期工作,javascript,ecmascript-6,Javascript,Ecmascript 6,我似乎不太可能发现某种明显的跨浏览器错误。但是根据文档,应该使用第四个参数作为thisArg(例如,如果set变量是setter)。第一个参数是要设置值的对象,但是每当我提供任何对象作为第四个参数时,都会在该对象而不是目标对象上设置值 var target = new Object; var thisArg = new Object; Reflect.set(target, 'variable', 52, thisArg); target.variable == undefined this

我似乎不太可能发现某种明显的跨浏览器错误。但是根据文档,应该使用第四个参数作为thisArg(例如,如果set变量是setter)。第一个参数是要设置值的对象,但是每当我提供任何对象作为第四个参数时,都会在该对象而不是目标对象上设置值

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

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

target.variable == undefined
thisArg.variable == 52
有什么解释吗

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

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

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

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

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

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

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

在我看来,它似乎是按预期工作的:我不太明白这一点,但这会让人困惑。例如,Reflect.get的工作原理与MDN上的描述相同:从中读取目标对象时,接收器用作thisArg。Chrome可能仍然需要-webkit-标志。正如Andreas所说,这是规范中定义的正确行为。您还需要什么其他信息<代码>[[Get]]的工作方式不同。这里,只有当属性是getter时才使用receiver:我猜MDN页面一定有错误,它说目标是设置值的对象。这很令人困惑。不过,您是对的,虽然所有正常的值写入都被转发到接收方(如果指定),但似乎在目标中调用了getter和setter(接收方为thisArg,完全反转)。@JohnSmith我看不出有什么反转。getter和setter(位于/继承于目标中)也在接收器上执行所有写入操作。我想这只是混淆了Reflect.get读取目标,而Reflect.set写入接收器。如果Reflect.get调用的目标没有getter或setter,那么接收方将被完全忽略,它只是在调用任何getter时选择性地指定thisArg。另一方面,Reflect.set可以完全忽略目标,如果它不包含任何setter,那么接收方就是真正的“目标”。