原型"论据"

Lar*_*ehm 3 javascript jquery mootools prototypejs

介绍

我们都知道argumentsJavaScript函数的这些愚蠢对象.

但为什么反对呢?不是阵列吗?

不,这不是,这就是为什么许多人称之为JavaScripts概念的失败:

(function () {
    return arguments.slice(); // TypeError: arguments.slice is not a function
}());
Run Code Online (Sandbox Code Playgroud)

意向

好的,这只是我要问的真实内容的介绍,但在问你需要更多信息之前:

虽然在最后几天阅读不同的代码,但在很多地方看到以下代码行时我感到非常伤心.

args = Array.prototype.slice(arguments);
Run Code Online (Sandbox Code Playgroud)

那么,它做了什么,只是简单地将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]];
        }
    }
}());
Run Code Online (Sandbox Code Playgroud)

压缩后,它只需要260个字节,并通过使用扩展arguments对象.prototypeArray.prototype

所以最后我可以arguments像"真正的"数组一样处理对象.


这个问题

在检查了最着名的JavaScript框架之后,我完成了以下操作:none使用这样的构造并扩展arguments对象的prototype.

但为什么?有什么不对,我现在没想到?

jba*_*bey 5

arguments对象是不是类型,它是一个通用Object.为了扩展它的原型,你必须扩展原型Object,这通常不是一个好主意.

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

假设我要扩展arguments原型:

arguments.constructor.prototype.foo = 'bar';
Run Code Online (Sandbox Code Playgroud)

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

var someNewObject = {
    someProperty: 'someValue'
};

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

你可以在这里看到这个.