Mah*_*aha 209 javascript function
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对象上调用ANY方法的通用函数.但这是否意味着指定的方法已经是指定对象的隐式成员?
我确信我对JavaScript函数的基本概念缺乏认真的理解.请帮我理解这个.
jAn*_*ndy 293
打破它.
.toUpperCase() 是一种方法 String.prototype'a'是原始值,但转换为其Object表示形式所以
'a'['toUpperCase'];
是通过支架符号访问属性toUpperCase,从String.prototype.由于此属性引用了一个方法,我们可以通过附加来调用它()
'a'['toUpperCase']();
Thi*_*ter 78
foo.bar并且foo['bar']是相同的,所以你发布的代码是相同的
alert('a'.toUpperCase())
使用时foo[bar](注意缺少引号)您不使用文字名称,bar而是使用变量bar包含的任何值.因此,使用foo[]符号而不是foo.允许您使用动态属性名称.
我们来看看callMethod:
首先,它返回一个obj以其为参数的函数.执行该函数时,它将调用method该对象.因此,给定的方法只需要存在于其obj自身或其原型链的某个地方.
如果toUpperCase该方法来自String.prototype.toUpperCase- 对于存在的每个字符串都有一个单独的方法副本是相当愚蠢的.
Art*_*oev 25
您可以使用.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
    }
}
Nis*_*isk 17
基本上,javascript将所有内容视为Object,或者更确切地说,每个对象都可以被视为字典/关联数组.并且函数/方法的定义方式与对象完全相同 - 作为此关联数组中的条目.
基本上,你正在引用/调用(注意' () ')'a'对象的'toUpperCase'属性(在这种情况下是一个字符串类型).
这是我头脑中的一些代码:
function myObject(){
    this.msg = "hey there! ;-)";
    this.woop = function(){
        alert(this.msg); //do whatever with member data
    }
}
var obj = new myObject();
alert( obj.msg );
alert( obj['msg'] );
obj['woop']();
所以在Javascript中,objects是objects.那是他们的本性{}.可以使用以下任一方式设置对象属性:a.greeting = 'hello';或a['greeting'] = 'hello';.两种方式都有效.
检索工作原理相同.a.greeting(没有引号)是'hello',a['greeting']是'hello'.例外:如果属性是数字,则只有括号方法有效.点方法没有.
因此,'a'与对象'toUpperCase'属性,它实际上是一个函数.您可以检索该函数并随后以任何方式调用它:'a'.toUpperCase()或'a'['toUpperCase']().
但是,编写地图功能的更好方法是
var caps = ['a','b','c'].map( function(char) { return char.toUpperCase(); } )
谁需要这个callMethod功能呢?
每个JavaScript对象都是一个哈希表,因此您可以通过指定密钥来访问其成员.例如,如果变量是一个字符串,那么它应该具有toUpperCase函数.所以,你可以调用它
var str = "a"
str['toUpperCase'](). // you get the method by its name as a key and invoke it.
所以,通过内联str,你可以在下面
"a"["toUpperCase"]()
toUpperCase是一种标准的javascript方法:https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/String/toUpperCase
它的工作原理'a'['toUpperCase']()是toUpperCase函数是字符串对象的属性'a'.您可以使用object[property]或引用对象的属性object.property.语法'a''toUpperCase'表示您正在引用'a'字符串对象的'toUppercase'属性,然后调用它().