我一直在阅读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()的源代码(替换this
用this
在不同的上下文中)?此外,在严格模式下使用时,此代码也可以使用吗?
谢谢你的帮助。
如果将ki函数用作构造函数,则el对象不会被推送到arr Array,而是被推送到this值,这将是创建的对象
arr = new Array
arr2 = new Array
document.querySelectorAll('a').forEach((el) => { arr2.push.call(arr, el); })
希望这可以帮助
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句