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”级别。

非常感谢

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) {}

如果你想添加arg4到 init,你必须在三个地方添加它!通过klass透明地将其所有参数传递给init,您可以使您的代码变得不那么脆弱。

于 2012-05-15T19:52:16.363 回答