为什么我必须调用()push()JS函数并重新设置它以获得预期的结果?

搜索解决方案

我一直在阅读ki.js源代码,偶然发现对call()函数的奇怪用法(请参阅function i(a)GitHub)。首先,i(a)出于我的目的简化了该函数,现在该函数如下所示:

function ki(selector, arr) {
    document.querySelectorAll(selector).forEach((el) => { arr.push.call(this, el); }); 
}

当我这样调用我的函数时new ki(".test", []);,会得到预期的结果-一个具有DOM对象的对象和一个从ki()函数原型复制的原型属性。
但是,当我稍微将ki()函数更改为:(删除不必要的call()函数):

function ki(selector, arr) {
    document.querySelectorAll(selector).forEach((el) => { arr.push(el); }); 
}

执行new ki(".test", []);将导致一个对象不包含任何DOM对象,而仅具有构造函数继承的prototype属性。

这是我不明白的。为什么需要操纵array.prototype.push()的源代码(替换thisthis在不同的上下文中)?此外,在严格模式下使用时,此代码也可以使用吗?
谢谢你的帮助。

来自的Michael Rooijen

如果将ki函数用作构造函数,则el对象不会被推送到arr Array,而是被推送到this值,这将是创建的对象

arr =  new Array
arr2 =  new Array

document.querySelectorAll('a').forEach((el) => { arr2.push.call(arr, el); }) 

希望这可以帮助

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

重新连接时,为什么必须在tmux中重新设置环境变量?

为什么我必须使用 await 来获得 promise 的结果?

为什么我的 map() 调用没有返回预期的结果?

为什么我必须重新声明外部函数?

为什么折线图未获得新设置

为什么可以重新设置参考参数?

为什么我们的Git存储库中缺少代码,可以通过重新设置解决它吗?

为什么我必须先启动Windows 10并重新启动,然后才能启动Ubuntu?

Git分支在重新设置基准后分歧了,那为什么要重新设置基准呢?

为什么我无法通过此AJAX和PHP验证获得预期的结果

为什么我得到与预期相反的结果?

R:为什么我没有获得按预期返回向量的函数?

为什么我必须重新加载页面才能让我的 JS 事件工作?

为什么我的外部函数在页面加载时被调用?JS

为什么连续的vector :: push_back结果导致不同数量的构造函数调用?

在React中,为什么我必须绑定一个onClick函数而不是调用它?

为什么我必须调用另一个函数?

为什么没有调用预期的函数?我是否错误地理解了类型特征?

为什么我必须清理并重新启动项目才能使用Firebase / Crash脚本文件运行项目

为什么我从date_format()PySpark函数获得空结果?

R语言:为什么我可以通过Sapply函数获得以下结果?

为什么我无法通过IndexedDB中的IDBKeyRange.bound函数获得正确的结果?

为什么我会从这个简单的python函数获得意外结果?

为什么我必须单击两次才能获得搜索结果菜单中的链接以加载页面?

为什么我不能调用我的函数?

为什么我必须要重新解释指针指针?

为什么LTRIM函数未返回预期结果

为什么当表单丢失并重新获得焦点时,FlowLayoutPanel会自动滚动回到顶部?

VSTS:在构建到期时自动重新设置/合并并重新排队构建验证门