9

this.init.apply(this, arguments)誰かが下のコードで何をしているのか教えてもらえますか?

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」レベルだけでなく、JSについてすべてを知りたいと思います。

どうもありがとう

4

1 に答える 1

9

apply関数オブジェクトのメンバー関数です。次のようなものがあるとします。

function saySomething(thing, anotherThing) {
    alert(this + " says " + thing + " and " + anotherThing);
}

次に、次を使用できます。

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で、コードの脆弱性を大幅に軽減できます。

于 2012-05-15T19:52:16.363 に答える