javascript - 为什么我必须调用() 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 对象的对象,只有构造函数继承的原型属性。
这是我不明白的。为什么需要操作 array.prototype.push() 源代码(在不同的上下文中替换this
)this
?此外,这段代码在严格模式下也能工作吗?
谢谢你的帮助。
解决方案
如果将 ki 函数用作构造函数,则 el 对象不会推送到 arr 数组,而是推送到this值,这将是创建的对象
arr = new Array
arr2 = new Array
document.querySelectorAll('a').forEach((el) => { arr2.push.call(arr, el); })
希望这可以帮助
推荐阅读
- vbscript - Global.asa 上的 Session_OnEnd 事件,并发问题
- sql - 如何使用户表对不同类型的用户通用?否则我是否需要根据 laravel 中的用户更改用户注册表?
- angular - 如何在Angular2-multiselect中显示选中的复选框计数?
- php - php laravel artisan 迁移模型中的错误?
- javascript - 如何比较价值
- javascript - 使用 pg-promise 执行接受参数数组的 Postgresql 函数
- apache-spark - 如何使用 spark 读取 hive 托管表数据?
- sql-server - Grafana 的 SQL Server DMV sys.dm_os_buffer_descriptors
- reactjs - Post Component 重新渲染甚至调用 Post Component 的其他实例
- css - 在 Confluence 中更改代码块的字体系列