在Javascript中使用apply()意味着什么
请告诉我在Javascript中使用apply()意味着什么,javascript,jquery,web-applications,Javascript,Jquery,Web Applications,请告诉我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 = f
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”级别
非常感谢是函数对象的成员函数。假设我们有:
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
需要参数。考虑一下如何在没有<代码>应用< /C> >:< /P>
var klass = function(arg1, arg2, arg3) {
init(arg1, arg2, arg3);
}
klass.prototype.init = function(arg1, arg2, arg3) {}
如果您想将
arg4
添加到init,您必须在三个位置添加它!通过让klass
透明地将其所有参数传递给init
,您的代码就不会那么脆弱了。可能的重复在您搜索该方法时是否有不清楚的地方?谢谢@Jeff。是的,我不明白为什么上面的代码中两次定义了init
。我问的问题是关于apply()
应用的上下文。非常感谢@apsillers。但是为什么它在自己内部调用init()
?为什么不直接使用klass.prototype.init()
?很抱歉打扰您,我想澄清一下……它的设计目的是使klass
完全透明——尽管在构建新实例时会调用klass
,init
是真正的“重担”函数,它可能需要参数。为了省去在klass
和init
上复制参数列表的麻烦,klass
不接受命名参数,只需使用apply
和arguments
将所有参数传递给init
。为什么要这样做?关于Klass图书馆我不知道该说些什么。为进一步澄清而编辑。现在我明白了,非常感谢。这就是我想澄清的原因。。。。但是,可以用对象作为参数来代替这种技术吗?在键/值属性中作为参数。。。i、 e.{key1:value1,key2:value2,…keyN:valueN}
…当然,这是一个完全有效且并不罕见的模式,您可以使用它来代替(或与)apply/arguments模式。