请有人告诉我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'级别。
非常感谢
答案 0 :(得分:9)
apply
是函数对象的成员函数。假设我们有:
function saySomething(thing, anotherThing) {
alert(this + " says " + thing + " and " + anotherThing);
}
然后我们可以使用:
saySomething.apply(document, ["hello", "goodbye"]);
这将调用该函数并将该数组的值作为参数提供给该函数。第一个参数是函数的 context (或者,函数运行时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
,您可以使代码更加脆弱。