首先请看如下代码:
function WhoAmI()       //定义一个函数WhoAmI
    {
        alert("I'm " + this.name + " of " + typeof(this));
    };
var BillGates = {name: "Bill Gates"};
    BillGates.WhoAmI = WhoAmI;  //将函数WhoAmI作为BillGates的方法。
    BillGates.WhoAmI();         //此时的this是BillGates。输出:I'm Bill Gates of object
     ({name: "nobody", WhoAmI: WhoAmI}).WhoAmI();    //临时创建一个匿名对象并设置属性后调用WhoAmI方法。输出:I'm nobody of object
关于上面创建的匿名对象有两点疑问:
1.为什么要使用小括号包起来?
2.临时创建的匿名对象并没有创建自己的WhoAmI方法,为什么可以直接调用WhoAmI方法?

解决方案 »

  1.   

    1.估计是js本身的语法格式
    2.第二个应该可以改成这样 ({name: "nobody", WhoAmI: function(){{alert("I'm " + this.name + " of " + typeof(this));}}}).WhoAmI();  匿名对象中已经有一个属性(实际上是一个方法)WhoAmI指向了外部的WhoAmI方法的一个引用.当调用WhoAmI()时,所以会出现当前的结果。期待高手进一步解释
      

  2.   


    1.小括号括起来是强制运算,让引擎识别是个对象
    如果没有小括号{name: "nobody", WhoAmI: WhoAmI}.XXX 引擎会把{}解析成块语句而不是对象就报错
    所以下面强制运算符都可以
     -{name: "nobody", WhoAmI: WhoAmI}.WhoAmI(); 
     +{name: "nobody", WhoAmI: WhoAmI}.WhoAmI(); 
     void{name: "nobody", WhoAmI: WhoAmI}.WhoAmI(); 
     typeof{name: "nobody", WhoAmI: WhoAmI}.WhoAmI(); 
    2.你的问题表示你来对象基本概念都不知道
    WhoAmI: WhoAmI这个不就是WhoAmI方法? 相当于
    WhoAmI: function(){
            alert("I'm " + this.name + " of " + typeof(this));
        };
      

  3.   

    十分感谢楼上的!!!
     
      由于急切寻找类似于这样的赋值语句BillGates.WhoAmI = WhoAmI;
    所以({name: "nobody", WhoAmI: WhoAmI}).WhoAmI();
    红色部分没有看到,呵呵.....
    以后要仔细了!