【发布时间】:2012-08-04 18:30:54
【问题描述】:
简介
我们都知道这些愚蠢的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 字节,并使用 Array.prototype 扩展 arguments 对象的 prototype。
所以我终于可以像处理“真实”数组一样处理arguments 对象了。
问题
在检查了最著名的 JavaScript 框架后,我完成了以下操作:没有一个使用这种结构并扩展了 arguments 对象的 prototype。
但是为什么呢?有什么问题吗,我现在没有想到?
【问题讨论】:
标签: javascript jquery prototypejs mootools