Array.prototype.slice.call(arguments);
と記述することで、配列ではないが、配列のような働きをするargumentsオブジェクトが持つ実引数を配列にすることができます。
Array.prototypeのsliceメソッドは、this参照を配列に変換する能力を持つそうです。sliceメソッドのあとでチェーンされているcallは、
レシーバオブジェクトのthis参照を第一引数、ここではargumentsオブジェクトにすることができます。
ここで質問ですが、なぜArray.prototype内に存在するthis参照をargumentsオブジェクトにすることでsliceメソッドなどが使えるようになるのでしょうか。
argumentsオブジェクトの__proto__がArray.prototypeになるとのことですが、Array.prototypeのthis参照をargumentsオブジェクトにすることと、個人的に繋がらず
ピンと来ません。
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
こんにちは
疑問点をよく把握できていませんが・・・
単純にcall関数がそのような仕様になっているからと考えるのではダメでしょうか?
NodeListなどのようにsliceをメソッドとして持っていないオブジェクトで、sliceメソッドを利用したい場合に、call関数を介することでArray.prototype.sliceメソッドを適用させるといった感じ。
https://developer.mozilla.org/ja/docs/Web/JavaSc …
No.2
- 回答日時:
関数 slice は「意図的に汎用的」です。
関数内で使用する this に対して、以下の操作が可能ならば、
* this[index] の読み取り
* this.length の読み取り
this が配列オブジェクトだろうが、
「配列のようなオブジェクト」だろうが、
問題なく処理できてしまいます。
当然 arguments はこの二つの操作を備えていますので、
call によって this を挿げ替えれば slice が使えてしまいます。
以下サンプルです
function slice() {
_ var x = [], n = this.length;
_ for (var i=0; i<n; i++) x.push(this[i]);
_ return x;
}
var 配列オブジェクト1 = slice.call(配列オブジェクト);
var 配列オブジェクト2 = slice.call(配列のようなオブジェクト);
余談ではありますが、
call に __proto__ を変更する機能はありません。
対象の関数に対して、関数スコープ内の変数 this を挿げ替えるだけです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- JavaScript 1日1回引けるJavaScriptおみくじについて 1 2022/12/12 22:28
- JavaScript オブジェクト配列の各メンバを任意の式で評価して、その評価値が最大のオブジェクトを返す関数はありますか 2 2023/05/20 15:02
- その他(プログラミング・Web制作) Pythonのオブジェクトの関数について 2 2023/05/11 19:15
- PHP クラス 1 2022/08/08 15:12
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
- PHP PHPでCSVを出力するさいに、ループの中で前の行の値を変更したい 1 2022/10/27 14:21
- PHP ファイルの書き込みについて教えて下さい。 1 2023/03/20 12:01
- PHP PHPでCSVを出力するさいに、ループの中で前の行の値を変更したい 3 2022/10/27 17:44
- Oracle 参照関係のフィールドについて 1 2023/05/27 17:49
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
パワーポイントのVBAでテキスト...
-
多人数のじゃんけんプログラム
-
C#でフォームのオブジェクト名...
-
Excelで =EMBED("Acrobat Docu...
-
COMコンポーネントって何?
-
Vbで通常使用するプリンターを...
-
bmp画像をjpegやpng画像に圧縮...
-
文字列でクラス型名を取得したい
-
Accessの連結・非連結オブジェ...
-
VBAのWindowオブジェクトとWork...
-
オブジェクト名をforループ内で...
-
Object型からDouble型へのキャスト
-
ArrayLsitのデータ取得
-
Listに格納されているオブジェ...
-
Listに格納されたオブジェクト...
-
JAVAからHTMLへ値を返す方法
-
Visual Studioでのbmpファイル...
-
.getElementById()のエラーにつ...
-
javaでは基本型の参照渡しは無...
-
LISTBOXの内容が更新されま...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
パワーポイントのVBAでテキスト...
-
Excelで =EMBED("Acrobat Docu...
-
EXCEL VBAにて動的にCheckBOXを...
-
ワイルドカード<?>と型パラメー...
-
C#でフォームのオブジェクト名...
-
VBAのWindowオブジェクトとWork...
-
vb.net オブジェクト指向につい...
-
COMコンポーネントって何?
-
オブジェクトレベルとメタレベル
-
ビジュアルC++でボタンの有...
-
時間帯判定をする。
-
LISTBOXの内容が更新されま...
-
VBA 同じ名前のオブジェクトを...
-
オブジェクト名をforループ内で...
-
Object型からDouble型へのキャスト
-
ADO オブジェクトの渡し方
-
bmp画像をjpegやpng画像に圧縮...
-
Vbで通常使用するプリンターを...
-
戻り値がクラスオブジェクト
-
VBAでvlookup関数から、別シー...
おすすめ情報