JavaScript中的'a'['toUpperCase']()如何以及为什么工作?
JavaScript让我感到惊讶,这是另一个例子。 我刚刚遇到了一些我一开始就不明白的代码。 所以我调试它并得出这个结论:
alert('a'['toUpperCase']()); //alerts 'A'
现在,如果toUpperCase()
被定义为字符串类型的成员,那么这一点很明显,但最初对我来说没有意义。
无论如何,
toUpperCase
是'a'的成员? 或者幕后有其他事情发生? 我正在阅读的代码具有如下功能:
function callMethod(method) {
return function (obj) {
return obj[method](); //**how can I be sure method will always be a member of obj**
}
}
var caps2 = map(['a', 'b', 'c'], callMethod('toUpperCase')); // ['A','B','C']
// ignoring details of map() function which essentially calls methods on every
// element of the array and forms another array of result and returns it
在任何对象上调用ANY方法都是一种通用的函数。 但是这是否意味着指定的方法已经是指定对象的隐式成员?
我相信我错过了对JavaScript函数基本概念的认真理解。 请帮我理解这一点。
打破它。
.toUpperCase()
是String.prototype
一种方法 'a'
是一个原始值,但被转换成它的对象表示 所以
'a'['toUpperCase'];
是通过来自String.prototype
的属性toUpperCase
上的括号表示法进行访问。 由于这个属性引用了一个方法,我们可以通过attach ()
'a'['toUpperCase']();
foo.bar
和foo['bar']
是相等的,所以你发布的代码和
alert('a'.toUpperCase())
当使用foo[bar]
(注意缺少引号)时,不使用文字名称bar
而是使用变量bar
包含的任何值。 因此使用foo[]
符号而不是foo.
允许您使用动态属性名称。
我们来看看callMethod
:
首先,它返回一个以obj
为参数的函数。 当该函数被执行时,它将调用该对象的method
。 所以给定的方法只需要存在于obj
本身或其原型链上。
在toUpperCase
情况下,该方法来自于String.prototype.toUpperCase
- 对于每个存在的单个字符串都有一个单独的方法副本,这将是相当愚蠢的。
您可以使用.propertyName
表示法或["propertyName"]
表示法访问任何对象的成员。 这是JavaScript语言的特点。 要确定该成员在对象中,只需检查它是否已定义:
function callMethod(method) {
return function (obj) {
if (typeof(obj[method]) == 'function') //in that case, check if it is a function
return obj[method](); //and then invoke it
}
}
链接地址: http://www.djcxy.com/p/2875.html
上一篇: How and why does 'a'['toUpperCase']() in JavaScript work?