2011-04-20 55 views
3

我有一些麻烦,谷歌搜索和计算器的答案是什么这一段JavaScript代码是这样做的:什么是这个奇怪的JavaScript数组语法?

obj['e'+type+fn](window.event); 

对我来说这看起来像一个参数/参数数组元素:

array[index](argument); 

但是,我只能猜测这是做什么。这相当于:

array[index]=argument 

哪个给数组元素指定一个参数?

如果任何人都可以提供一个简单/通用的例子,说明这样做会很好。我试图破译John Resig's addEvent() implementation。我并不是真的在寻找关于这个实现或者与之相关的例子的解释,而更像是一个虚拟的例子,比如MDC has done for call,它使用了一些想象中的产品。

回答

5
obj['e'+type+fn](window.event); 

这只是一种访问对象属性的方法。举例来说,如果你有一个对象

a = { 
name: 'someName' 
age: 20 
}; 

您可以通过使用a.name或访问名,如上述a['name']

他使用[]表示法的原因是,他可以从多个字符串构建密钥。

因此,如果type=clickfn=foo他正在访问obj.eclickfoo。或者obj['eclickfoo']

对象的这个属性必须是一个方法,因为他使用()调用它;如此反复,他说:

obj.eclickfoo(window.event); 

或同等

obj['eclickfoo'](window.event); 
2

这是它在做什么:

从阵列obj,它需要的功能与指数'e'+type+fn。然后它执行它作为参数传递window.event

请记住,()调用一个函数,而[]从数组中提取一个值。

+1

这与运行类似'obj.esome_typesome_function(window.event)'的东西是一样的,除了你提到的符号允许你动态地编写属性名。 – 2011-04-20 01:32:52

+0

@汉斯恩格尔:没错 – 2011-04-20 01:33:13

0

obj['e'+type+fn]返回函数类型。然后用window.event作为参数执行。

0
obj['e'+type+fn](window.event); 

阵列确实可以用 “OBJ [...]” 符号,但这样可以在JavaScript中的任何对象。在这种情况下,Resig将该属性添加到任何对象,特别是DOM对象。

obj['aVar']相当于obj.aVar。前者的优点在于它也可以与JavaScript中保留的具有特殊含义的关键字一起工作(例如,,obj ['var']如果你在一个对象上定义了一个名为“var”的属性),并允许动态访问属性名称,如你的例子。由于type是一个变量,因此无法执行obj.type,因为这将找到一个完全命名为“type”的属性,但找不到名称等于type变量值的属性。由于对象(或数组)可以将函数保存为数据,所以您也可以在对象或数组内部的函数中使用调用操作符(匹配的括号),就像这里所做的那样 - 访问该属性(这是一个先前存储在对象上的“方法”或函数),然后用window.event对象作为单个参数进行调用。

功能也都有内置toString方法对他们的原型(这将调用在这样的你在哪里被串联成一个字符串,因此,必须要一个字符串的情况下,只要你不设置您的在你的函数中拥有toString方法,因为函数也是JavaScript中的对象!)。 Resig的代码正在利用这一点来定义一个新的属性,这个属性通常是一个糟糕的主意,但以一种不太可能与其他应用程序冲突的方式来添加这样的属性。

所以,如果document.bodyobj如果type变量设置为“点击”和“FN”设置为function() {alert('boo!');}",它实际上将命名document.body对象上的属性为“eloadfunction(){警报( '嘘!');}”。正如他解释的那样,创建这个属性(然后在他自己的匿名函数中调用它)允许调用该函数,并使用里面使用的任何“this”关键字的正常行为 - this将引用父对象,在这种情况下obj,而不是全局(除非obj是全局的 - 即window对象)。