2

thisこの手法については多くの質問と回答がありますが、call() または apply() に必要なコンテキストがどのように設定されるかについての回答が見つからないようです。

という事は承知しています

Array.prototype.slice.call(arguments)

とある程度同等です

arguments.slice()

適切な配列オブジェクトに変換さargumentsれますが、この規則を自分のオブジェクトで使用しようとすると機能しません。私はこれを行う小さなテストを書き込もうとしました:

var Logger = function(){};
Logger.prototype.print = function(msg){ 
   console.log ((new Date()).getTime().toString() + msg); 
};

(function(){
   var o = {
    name: "Hi Bob!",
   };

   var l = new Logger();
   l.print(o.name); //works fine
   Logger.prototype.print.call(o.name); //calls print method, but 'msg' is undefined
}());

その関数アプリケーションが必要なコンテキストなしで機能することを可能にする、Array.prototypeまたはオブジェクトに関して何か特別なことはありますか?arguments

4

2 に答える 2

2

sliceと関数の違いは、関数が引数のみを使用するのに対しslice、コンテキスト( )を使用することです。this

call本当に関数で使用したい場合は、次のように使用してください

Logger.prototype.print.call(null, o.name);

しかし、あなたは

 Logger.prototype.print(o.name);
于 2013-03-18T15:53:50.510 に答える
1

あなたのプリントはどこでも変数Logger.prototype.printを使用していないので、使用しても意味がありません。関数は、パラメーターとして渡されることを期待しています。これが機能する理由です。thiscall()msgl.print(o.name);

あなたの質問で言うように:

Array.prototype.slice.call(arguments)

に似ていarguments.slice()ます。したがって:

Logger.prototype.print.call(o.name);

に似ていo.name.print()ます。ご覧のとおり、これは意味がありません。

本当にを使用したい場合.call()は、次のようにすることができます。

Logger.prototype.print.call(null, o.name);

しかし、ご覧のとおり、これはばかげており、単にl.print(o.name);.

于 2013-03-18T15:56:42.743 に答える