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.barfoo['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?

    下一篇: Javascript call() & apply() vs bind()?