2012-05-15 4 views
9

this.init.apply(this, arguments)は以下のコードで何をしているのですか?Javascriptでのapply()の使用方法

一般的にはapply()のことを理解していますが、以下のコードの文脈では、そこでは何をしていますか?

var Class = function() { 

    var klass = function() { 
     this.init.apply(this, arguments); //I don't really get this bit... 
    }; 

    klass.prototype.init = function(){}; 

    return klass; 
}; 

var Person = new Class; 

//Usage 
var someone = new Person; 

私はそれを使用している多くの人がいます。私はそれが何をしているのか分かっていますが、実際に手を置くことはできないので、もっと光が必要です。

私はJSで余分なレベルに上がるので、単純な「Hello world」レベルではなく、すべてについて知りたいと思っています。

感謝

+5

https://developer.mozilla.org/ja/JavaScript/Reference/Global_Objects/Function/apply – SLaks

+2

[Apply()question for javascriptの可能な複製](http://stackoverflow.com/questions/4638450/apply) -question-for-javascript) – kapa

+4

あなたがそれについてグーグルで調べたときにその方法がどのように記述されたかについて不明な点がありましたか? – Jeff

答えて

9

applyは、関数オブジェクトのメンバ関数あります。我々が持っていると仮定します。

その後、我々は使用することができます。

saySomething.apply(document, ["hello", "goodbye"]); 

これは、関数を呼び出し、関数の引数として配列の値を提供します。最初の引数は、関数の文脈になります(または、関数が実行されるときは、thisとなります)。

また、argumentsは、関数に渡されるすべての引数の配列を保持する特別な変数であることにも注意してください。したがって、this.init.apply(this, arguments)は、init関数が呼び出され、klassコンストラクタに渡されたすべての引数が渡されたことを意味します。

実際の実装では、initは引数が必要です。これはapplyせずに実行されるだろうか考えてみましょう:

var klass = function(arg1, arg2, arg3) { 
    init(arg1, arg2, arg3); 
} 

klass.prototype.init = function(arg1, arg2, arg3) {} 

あなたがinitにarg4を追加したい場合は、次の3つの場所でそれを追加必要があると思います! klassがすべての引数を透過的にinitに渡すようにすることで、コードははるかに脆弱になります。

+0

多くのありがとう@apillers。しかし、なぜそれ自身の中で 'init()'を呼び出すのですか?なぜ単に 'klass.prototype.init()'を使わないのですか?このことについて迷惑を掛けて申し訳ありませんが、私は物事を明確にしたいと思います... – Shaoz

+2

'klass'を完全に透明にするように設計されています - ' klass'は新しいインスタンスをビルドするときに呼び出されますが、 'init'は関数です実際の "重い持ち上げ"とそれは議論を期待するかもしれません。 'klass'と' init'に引数リストを複製する手間を省くため、 'klass'は名前付き引数を取らず、単に' apply'と 'arguments'を使ってすべての引数を' init'に渡します。なぜこのようにしたのですか?私はKlassライブラリについて十分に知りません。 – apsillers

+0

さらに明確にするために編集されています。 – apsillers