序章
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 バイトしかなく、を使用してarguments
オブジェクトを拡張します。prototype
Array.prototype
最終的にarguments
、「実際の」配列と同じようにオブジェクトを処理できるようになりました。
質問
最も有名な JavaScript フレームワークをチェックした後、私は次のように仕上げましarguments
たprototype
。
しかし、なぜ?何か問題がありますか、私は今考えていませんか?