介绍
我们都知道这些愚蠢arguments
的 JavaScript 函数对象。
但为什么反对?不是数组吗?
不,不是,这就是为什么很多人称其为 JavaScript 概念的失败:
(function () {
return arguments.slice(); // TypeError: arguments.slice is not a function
}());
意图
好的,这只是我想问的真实情况的介绍,但在问之前您需要更多信息:
在最后几天阅读不同的代码时,在很多地方看到以下代码行时,我感到非常害怕。
args = Array.prototype.slice(arguments);
所以,它的作用是简单地将arguments
对象“转换”为包含所有原型和内容的数组。
我的解决方案
我想到的是:虽然 JavaScript 都是关于原型设计的,但我们为什么不扩展arguments
对象prototype
本身呢?我检查了一些网站的现有脚本,但没有发现任何我想要找到的东西,最后我自己写了:
(function () {
var i, methods;
arguments.constructor.prototype = Array.prototype;
methods = ['concat', 'join', 'pop', 'push', 'reverse', 'shift', 'slice', 'sort', 'splice', 'toString', 'unshift'];
for (i = 0; i < methods.length; i += 1) {
if (arguments.constructor.prototype.hasOwnProperty(methods[i]) === false) {
arguments.constructor.prototype[methods[i]] = Array.prototype[methods[i]];
}
}
}());
压缩后它只需要 260 字节,并arguments
通过prototype
使用Array.prototype
.
所以最后我可以像处理arguments
“真实”数组一样处理对象。
问题
在检查了最著名的 JavaScript 框架后,我完成了以下操作:没有使用这种结构并扩展了arguments
对象的prototype
.
但为什么?有什么问题吗,我现在没有想到?