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:权威指南的完整示例
答案 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()
。因此,您可以通过例如
var mySet = new Set(13,42,18,19,44,11,5);
所有这些值都将传递给add()
。