関数arguments
プロパティ(Mozillaが「配列のような」プロパティと呼ぶもの)の個々の要素を設定することは可能ですが、これは1.6で修正されていますが、MozillaはSpiderMonkey1.5でこのプロパティに要素を追加することはできないと報告しています(参照ここでSpiderMonkeyに注意してください... https://developer.mozilla.org/en/JavaScript/Reference/Functions_and_function_scope/arguments)。
これは便利なプロパティであり、サブクラスからコンストラクターをチェーンしたり、関数(たとえばmyclassmethod.apply(this, arguments)
)に渡す引数のリストを作成したりします。
ただし、MozillaがSpiderMonkey 1.5について報告しているのと同じように、V8では長さが延長されないことがわかりました。(他のJavaScriptエンジン、Opera、Rhinoなどのステータスがわからない)。
これは実際にはECMA機能ですか?Mozillaはこれをバグと見なすのに誤りがありますか、それともV8には修正すべきバグがありますか?
[更新]V8を使用すると、arguments.length
プロパティを割り当てることができるため、効果的arguments
に拡張できます(または、必要な長さに設定できます)。ただし、JSLintはこれが悪い割り当てであると文句を言います。
[更新]OperaやFFなどでこれを試したい場合は、テストコードarguments
で、サブクラスコンストラクターに要素を追加し、スーパークラスコンストラクターを呼び出しながら、1つの引数でコンストラクターを呼び出すサブクラスのインスタンスを作成します。スーパークラスはレポートする必要があります。 2つの引数:
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);
arguments
[更新]JSLintは、ルックス(たとえば)によって何らかの割り当てを行うと、実際に文句を言いますarguments[0] = "foo"
。したがって、おそらくJSLintにはここでもやるべきことがいくつかあります。