可以设置函数属性的单个元素arguments
(Mozilla 称之为“类数组”属性),但是 Mozilla 报告说,在 SpiderMonkey 1.5 中无法向该属性添加元素,尽管这在 1.6 中已修复(参考请注意此处的 SpiderMonkey... https://developer.mozilla.org/en/JavaScript/Reference/Functions_and_function_scope/arguments)。
这是一个有用的属性,从子类链接构造函数,创建参数列表以传递给函数(例如,myclassmethod.apply(this, arguments)
)等。
但是我发现 V8 不会像 Mozilla 报告的 SpiderMonkey 1.5 那样延长长度。(不确定其他 JavaScript 引擎、Opera、Rhino 等的状态如何)。
这实际上是 ECMA 功能吗?Mozilla 认为这是一个错误是错误的,还是 V8 有一个错误要修复?
[更新]我发现使用 V8arguments.length
可以分配属性,因此arguments
可以有效地扩展(或设置为您需要的任何长度)。然而 JSLint 确实抱怨这是一个糟糕的任务。
[更新] 一些测试代码如果有人想在 Opera、FF 等中尝试这个,创建一个子类的实例,用一个 arg 调用构造函数,同时arguments
在子类构造函数中添加一个元素并调用超类构造函数,超类应该报告两个论点:
function MyClass() {
if (arguments.length) {
console.log("arguments.length === " + arguments.length);
console.log("arguments[0] === " + arguments[0]);
console.log("arguments[1] === " + arguments[1]);
}
}
function MySubClass() {
console.log(arguments.length);
//arguments.length = 2; // uncomment to test extending `length' property works
arguments[1] = 2;
MyClass.apply(this, arguments);
}
MySubClass.prototype = new MyClass();
new MySubClass(1);
[更新] JSLint 实际上会在您arguments
通过外观进行任何类型的分配时抱怨(例如,arguments[0] = "foo"
)。所以也许 JSLint 在这里也有一些工作要做。