stone310
this是函数被调用的时候,函数被谁调用,this就指向谁;var myfn=new fn()时,是创建了一个实例,然后实例this指向fn,然后_proto_属性指向fn的prototype属性;因此当创建好实例,myfn实例上有a和b,(即fn里面的this.a和this.b);它的_proto_属性(相当于fn的prototype属性)上有b和c;(这里有2个b重名,如果调用b,会先查找实例上的,如果发现实例上没有,再去沿着_proto_属性去查找);因此当执行myfn.b()时(这里在myfn上执行b函数,函数被myfn调用),会先在myfn的实例上面去找b,这里它的实例上是有this.a和this.b,这里this指的就是myfn,因此执行b() this.b = function() {
alert(this.a) //这里执行时函数是被myfn调用,因此this还是指向myfn
}所以就是alert(myfn.a)也就是alert(0);当执行myfn.c()时(这里在myfn上执行 c函数,函数被myfn调用),会先在myfn的实例上面去找c,这里它的实例上没有c,于是在myfn的_proto_(即fn的prototype)属性上去找c,执行c() c: function() {
this.a = 30; //被myfn调用,this指向myfn,a覆盖原来的a;
alert(this.a); //被myfn调用,this指向myfn,this.a为30
}所以alert(30)