2011-09-13 120 views
5
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权威指南”中用于创建“Set”类的代码的开始。我试图在构造函数中合理化apply()函数的必要性,但无法想象出我的生活。为什么构造函数中需要apply()函数

this.add.apply(this, arguments); 

如果add()功能已经是一个被“this”又是什么目的或用途调用的方法是核心apply()功能实现。在此先感谢任何人谁试图解释这个给我

http://jsfiddle.net/Marlin/Ydwgv/ - 从Javascript完整的例子:权威指南

+0

它似乎没有什么用处。我有*从未*见过它...... – Blender

+0

你对传递参数对象的事实有何想法? – ChaosPandion

+0

你不认为它可能与确保add()不作为实例的属性而不是原型添加有关?我明白这不是正在宣布......但它肯定令我困惑 – Marlin

回答

7

“如果add()函数已经是由‘这个’,然后调用的方法有什么目的或用途的核心应用()函数实现。

从而使arguments可以作为一个完整的集合来传递。如果Set接受无限数量的参数,则此参数有用。

+0

好的,让我看看我是否有这个。 add()接受无限的参数,但不接受集合。通过使用apply()你可以绕过这个限制吗? – Marlin

+0

@Marlin粗略地说,是的;-)推测,'add'主体遍历'arguments'对象,并对每个元素(每个元素表示该函数被调用的参数)执行一些操作。 – 2011-09-13 04:22:03

+0

@Marlin:是的,使用'.apply()',无论将多少个单独的参数传递给'Set()',它们都会作为单独的参数传递给'.add()'。 – user113716

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) 

是等价的。

快乐编码。


*在FireFox之前,它必须是一个数组本身。这就是为什么有时候代码使用丑陋成语:

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

我相信,它被称为不适合的范围,但适用的事实,将采取的参数数组,并通过他们依次是:

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

没有一个参数是一个数组

+0

完美,我很欣赏 – Marlin

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); 
+0

的快速反应,这正是我需要知道的。在前几天学会了应用,认为它只是用来调用来自不同对象的方法 – Marlin

1

使用.apply()语法允许您将一个参数数组传递给被调用的函数。在这种情况下,它将传递arguments对象,这意味着它将调用add()以及传递给Set构造函数的所有参数。所以,你可以说,例如创建值任意数量的新集对象,

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

而所有这些数值将传递到add()

+0

谢谢,我之前的apply的read包含了这个解释,但更多地关注它从不同对象调用方法的能力 – Marlin

相关问题