<分区>
简介
我们都知道 JavaScript 函数的这些愚蠢的 arguments
对象。
But why object? Isn't it an array?
不,不是,这就是为什么很多人称它为 JavaScript 概念的失败:
(function () {
return arguments.slice(); // TypeError: arguments.slice is not a function
}());
意图
好的,这只是我想问的真实问题的介绍,但在问之前你需要更多信息:
这几天看不同的代码,在很多地方看到下面这行代码,吓坏了。
args = Array.prototype.slice(arguments);
那么,它的作用是简单地将 arguments
对象“转换”为一个包含其所有原型(prototype)和内容的数组。
我的解决方案
我的想法如下:虽然 JavaScript 完全是关于原型(prototype)设计的,但我们为什么不扩展 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 字节,并使用 Array.prototype
扩展 arguments
对象的 prototype
。
所以我终于可以像处理“真实”数组一样处理arguments
对象了。
问题
在检查了最著名的 JavaScript 框架之后,我完成了以下内容:没有人使用这样的构造并扩展了 arguments
对象的 prototype
。
但是为什么?我现在没有想到有什么问题吗?