首页 > 解决方案 > 为什么我必须调用() 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() 源代码(在不同的上下文中替换thisthis?此外,这段代码在严格模式下也能工作吗?
谢谢你的帮助。

标签: javascriptobjectconstructorprototypenew-operator

解决方案


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

arr =  new Array
arr2 =  new Array

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

希望这可以帮助


推荐阅读