为什么ES6 Object Destructuring不适用于本机javascript原型



我一直在处理ES6 Object Destructuring,并开始尝试通过Destructuring定义函数属性。例如:

const obj = {
test() {
return console.log('Hello World');
},
};
const { test } = obj;
test();

所以我开始怀疑是否可以通过析构函数定义原生原型方法。然而,这并没有像我预期的那样奏效。下面是一个我试图通过析构函数执行Array.prototype.forEach()函数的例子:

const arr = [1, 2, 3, 4, 5];
const { forEach } = arr;
forEach((num) => console.log(num))

正如你所看到的,我得到了这个错误:

未捕获类型错误:Array.prototype.forEach在null或未定义的上调用

这是否与this在箭头函数内不对应于通常值的原因相同?

Array.prototype.hello = () => console.log(`Hello ${this}`);
[1, 2, 3].hello()
Array.prototype.hello = function() {  return console.log(`Hello ${this}`); };
[1, 2, 3].hello()

所以我开始怀疑是否可以定义原生原型方法通过破坏。然而,这并没有像我预期的那样奏效。以下是我尝试执行Array.protype.forEach((函数通过销毁

这不是析构函数的问题,这是因为没有设置上下文。您已经从数组中取出forEach引用,并在没有任何上下文的情况下调用它。

如果不进行销毁,如果你也这样做,你会得到同样的错误:

const arr = [1, 2, 3, 4, 5];
const forEach = arr.forEach;
forEach((num) => console.log(num));

如果将上下文设置为数组arr,则在销毁后显式地将其工作:

const arr = [1, 2, 3, 4, 5];
const { forEach } = arr;
forEach.call(arr, (num) => console.log(num));

如果你检查Array#forEach的polyfill,你会看到这行:

if (this == null) { throw new TypeError('Array.prototype.forEach called on null or undefined'); }

当您尝试在没有上下文的情况下调用forEach时,这实际上就是您得到的结果。这是必需的,因为forEach需要一个数组上下文才能工作。如果没有正确的上下文,forEach如何知道要迭代哪个数组或数组中有多少元素。

最新更新