《悟透JavaScript》学习札记六之放下对象

Codes:

function WhoAmI()
{
alert("I'm " + this.name + " of " + typeof(this));
};
WhoAmI(); // output: I'm of object
// 此时this是根对象window,其name属性为空字符串
var Bill = {name: "Bill"};
Bill.WhoAmI = WhoAmI; // 将函数WhoAmI作为BillGates的方法。
Bill.WhoAmI();// this是Bill,output: I'm Bill of object
var Sam = {name: "Sam"};
Sam.WhoAmI = WhoAmI;
Sam.WhoAmI(); // output: I'm Sam of object

WhoAmI.call(Bill); //output: I'm Bill of object
WhoAmI.call(Sam); // output: I'm Sam of object

Bill.WhoAmI.call(Sam); // 将Sam作为this,却调用Bill的方法。output: I'm Sam of object
Sam.WhoAmI.call(Bill); // 将Bill作为this,却调用Sam的方法。output: I'm Bill of object

WhoAmI.WhoAmI = WhoAmI; // 将WhoAmI函数设置为自身的方法。
WhoAmI.name = "WhoAmI";
WhoAmI.WhoAmI(); // 此时的this是WhoAmI函数自己。output: I'm WhoAmI of object

({name: "nobody", WhoAmI: WhoAmI}).WhoAmI(); // 创建一个匿名对象并调用其方法。output: I'm nobody of object

以上代码可以看出,this并不一定是函数本身所属的对象。在JavaScript函数中,你只能把this看成当前要服务的“这个”对象。在一般对象语言中,方法体代码中的this可以省略,成员默认都首先是“自己”的。但JavaScript却不同,由于不存在“自我”,当访问“这个”对象时,this不可省略。

注:self属性表示网页结构的当前window对象,以及frame或iframe元素的window对象。

你可能感兴趣的:(JavaScript)