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

时间:2011-09-13 03:43:04

标签: javascript

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:The Definitive Guide”中用于创建“Set”类的代码的开头。我试图在构造函数中合理化apply()函数的必要性,但无法弄清楚它的生命。

this.add.apply(this, arguments);

如果add()函数已经是“this”调用的方法,那么核心apply()函数的用途或用途是什么。提前感谢任何试图向我解释的人

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

5 个答案:

答案 0 :(得分:7)

  

“如果add()函数已经是'this'调用的方法,则实现核心apply()函数的目的或用途是什么。

这样arguments就可以作为整个集合传递。如果Set接受无限数量的参数,则非常有用。

答案 1 :(得分:2)

在构造函数中不需要 - 事实上,它与一般的构造函数没有任何关系(但显然它对于这个特定的一个;-)很重要。 apply 所做的是确保“正确”调用目标函数。

apply,当给定类似数组的对象*(arguments计数),[n1, n2, ... n3]和函数f时,它会将目标函数称为f(n1, n2, ... n3)apply也接受了“this context”,它在代码中传递了新创建的对象(看起来好像add被称为“正常方法”)。有关更多信息/示例,请参阅上面的链接。

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

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

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

是等价的。

快乐的编码。


*在4之前的FireFox中,它必须是Array-proper。这就是为什么有时代码使用丑陋的习语:

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

答案 2 :(得分:1)

我认为它不是为范围调用的,但apply的事实将采用一系列参数并按顺序传递它们:

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

不是一个数组

的参数

答案 3 :(得分:1)

函数的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);

答案 4 :(得分:1)

使用.apply()语法允许您将一组参数传递给正在调用的函数。在这种情况下,它传递arguments对象,这意味着它使用传递给Set构造函数的任何和所有参数调用add()。因此,您可以通过例如

来创建具有任意数量值的新Set对象
var mySet = new Set(13,42,18,19,44,11,5);

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