为什么在构造函数中需要apply()函数

Why is the apply() function needed in the constructor

本文关键字:apply 函数 构造函数 为什么      更新时间:2023-09-26
function Set() {          // This is the constructor
    this.values = {};     
    this.n = 0;          
    this.add.apply(this, arguments);  // All arguments are values to add
}
// Add each of the arguments to the set.
Set.prototype.add = function() {
    /* Code to add properties to the object's values property */
    return this;
};

这是"Javascript:权威指南"中用于创建"Set"类的代码的开头。我试着在构造函数中合理化apply()函数的必要性,但无论如何也弄不清楚。

this.add.apply(this, arguments);

如果add()函数已经是' this '调用的方法,那么核心apply()函数实现的目的或用途是什么?提前感谢任何试图向我解释这一点的人

http://jsfiddle.net/Marlin/Ydwgv/-来自Javascript的完整示例:权威指南

"如果add()函数已经是由'this'调用的方法,那么apply()核心函数的目的或用途是什么? "

以便arguments可以作为整个集合传递。如果Set接受不确定数量的参数,

在构造函数中不需要它——事实上,它与一般的构造函数无关(但显然对这个特定的构造函数很重要;-)。apply 所做的是确保目标函数被"正确"调用。

apply,当给定一个类数组对象* (arguments计数)、[n1, n2, ... n3]和一个函数f时,它将调用目标函数f(n1, n2, ... n3)apply还接受"this上下文",该上下文在代码中传递给新创建的对象(使其看起来好像add被称为"普通方法")。查看上面的链接以获得更多信息/示例。

这意味着,对于上面的代码,

var s = new Set(1, 2, 3)

var s = new Set()
s.add(1, 2, 3)

是等价的。

幸福的编码。


*在FireFox 4之前,它必须是Array-proper。这就是为什么有时代码使用难看的习惯用法:

f.apply(context, Array.prototype.slice.call(arguments, 0))

我认为它被调用不是为了作用域,而是应用程序将接受一个参数数组并按顺序传递它们:

this.add.apply(this, [1,2,3,4]);
....
function add(one, two, three, four)

没有一个参数是数组

函数的apply方法允许您通过传递数组而不是项列表来调用函数。

游戏介绍:

function add(a, b) {
    return a+b;
}
var values = [1,2];
alert(add.apply(this, values));
3.


所以,本质上,你在这里所做的是允许你的构造函数接受任意数量的参数,然后你将它们一次性全部传递给add函数。所以,如果你要用:

来调用构造函数
var stack = new Set(1,2,3,4,5,6,7,8,9);

所有这些值都将传递给add函数,就像您写的那样:

this.add(1,2,3,4,5,6,7,8,9);

使用.apply()语法允许您将参数数组传递给正在调用的函数。在本例中,它正在传递arguments对象,这意味着它正在使用传递给Set构造函数的任何和所有参数调用add()。因此,你可以用任意数量的值创建新的Set对象,例如,输入

var mySet = new Set(13,42,18,19,44,11,5);

所有这些值都将传递给add()