Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Javascript中使用apply()意味着什么_Javascript_Jquery_Web Applications - Fatal编程技术网

在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模式。