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

标签 javascript object constructor prototype new-operator

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

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

当我这样调用我的函数时:new ki(".test", []);,我得到了预期的结果——一个包含 DOM 对象的对象和一个从ki()函数原型(prototype)。
但是,当我稍微将 ki() 函数更改为:(删除在我看来不必要的 call() 函数):

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

执行 new ki(".test", []); 将产生一个没有任何 DOM 对象的对象,只有构造函数继承的原型(prototype)属性。

这是我不明白的。为什么有必要操作 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); }) 

希望对你有帮助

关于javascript - 为什么我必须调用 () push() JS 函数并重新设置它以获得预期的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56889703/

相关文章:

javascript - 如何解释负数组索引

javascript - 在 Promise 中,使用 catch 和 then 的第二个参数有什么区别?

javascript - 在 {} 对象创建中引用其他属性

C++ - 析构函数的调用次数超过预期

javascript - 当另一个函数完成时暂停函数

c++ - 更有效地创建静态本地对象 C++

java - 我需要一种在列表中存储许多不同项目的方法

c++ - 如何在 C++ 中绑定(bind)构造函数?

c++ - 成员变量初始化

php - 网络应用架构设计