javascript - 原型(prototype)制作 "arguments"

标签 javascript jquery prototypejs mootools

<分区>

简介

我们都知道 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

但是为什么?我现在没有想到有什么问题吗?

最佳答案

arguments 对象不是一个类型,它是一个通用的对象。为了扩展它的原型(prototype),您必须扩展 Object 的原型(prototype),这通常不是一个好主意。

使用 Array.prototype.slicearguments 转换为数组没有任何问题。

假设我要扩展 arguments 原型(prototype):

arguments.constructor.prototype.foo = 'bar';

这里的问题是 arguments.constructor 不是一些 Argument 对象,它只是 Object。现在,如果我尝试做一些应该正常工作的事情,那就太糟糕了:

var someNewObject = {
    someProperty: 'someValue'
};

for (var item in someNewObject) {
    console.log(item);  // logs someProperty AND foo, not good
}

您可以在实际操作中看到这一点 here .

关于javascript - 原型(prototype)制作 "arguments",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11851107/

相关文章:

jquery - 在商业软件中分发 jquery 许可证

javascript - 使用 Prototype JS 迭代 json 对象数组并根据键对其进行排序

javascript - 将 Slick 旋转木马导航箭头与幻灯片图像而不是其下方的文本垂直对齐

javascript - 当我尝试使用 dblclick() 打开电子邮件客户端时,显示 "Event is not defined"错误消息

javascript - 有助于查找混淆的 JavaScript 的关键字符

jquery - 重新加载页面时删除哈希?

javascript - 在 onKeyup AJAX 调用中第一次或后退时不起作用

javascript - 将对象传递给 jQuery.on()

javascript - JS 没有原型(prototype)就无法工作

javascript - Scriptaculous 无法使用最新的原型(prototype)