よし、置換によってこの問題に取り組みましょう。まず始めに:
Function.prototype.call.apply(Array.prototype.slice, arguments);
私たちが知っていること:
Function.prototype.call
関数です。
- の
this
ポインターは をcall
指しFunction.prototype
ます。
- のポインターをに
apply
変更するために使用します。this
call
Array.prototype.slice
arguments
に適用されます (パラメータとして渡されません) call
。
したがって、上記のステートメントは次と同等です。
Array.prototype.slice.call(arguments[0], arguments[1], ...);
このことから、次のことがわかります。
Array.prototype.slice
関数です。
- の
this
ポインターは をslice
指しArray.prototype
ます。
- のポインターをに
call
変更するために使用します。this
slice
arguments[0]
arguments[1], ...
にパラメータとして渡されますslice
。
これは次と同じです。
arguments[0].slice(arguments[1], ...);
これの利点は、1 行で高速なバインドされていないラッパーを作成できることです。slice
編集:バインドされていない高速ラッパーを作成するより良い方法は次のとおりです (一部の古いブラウザーでは機能しない可能性があることに注意してください。ただし、今はそれについて心配する必要はありません。サポートbind
):
var slice = Function.prototype.call.bind(Array.prototype.slice);
これは次と同じです。
function slice() {
return Function.prototype.call.apply(Array.prototype.slice, arguments);
}
使い方:
Function.prototype.call
関数です。
- の
this
ポインターは をcall
指しFunction.prototype
ます。
- のポインターをに
bind
変更するために使用します。this
call
Array.prototype.slice
bind
arguments
に適用される関数を返しますcall
。
おまけ:あなたのプログラミング スタイルが私のように非常に機能的である場合、コードの一部が非常に便利であることがわかります。
var funct = Function.prototype;
var obj = Object.prototype;
var arr = Array.prototype;
var bind = funct.bind;
var unbind = bind.bind(bind);
var call = unbind(funct.call);
var apply = unbind(funct.apply);
var classOf = call(obj.toString);
var ownPropertyOf = call(obj.hasOwnProperty);
var concatenate = call(arr.concat);
var arrayFrom = call(arr.slice);
call
これを使用すると、またはを使用してバインドされていないラッパーを簡単に作成できますapply
。
classOf
値の内部を取得するために使用でき[[Class]]
ます。
ownPropertyOf
内部 for in ループを使用できます。
concatenate
配列を結合するために使用できます。
arrayFrom
配列の作成に使用できます。