javascript 關於 this 和 scope 的問題

測試網頁如下

[code="java"]

this.abc = 'abc'; function log(msg) { var obj = document.getElementById("log"); obj.innerHTML = obj.innerHTML + msg + "<br/>"; } function a() { var a1 = 'a1'; // local var this.a2 = 'a2'; // context var this.toString = function() { return "i am a"; }; function a3() { return "a3 ,this.a2=" + this.a2; } return { b1:'b1', b2:function() { alert("this in b2 " + this + " a1:" + a1 + " a2:"); return "b2 ,this.a1=" + this.a1 + ",this.abc=" + this.abc ; } }; } a.a4 = 'a4'; a.prototype.hello = 'a5'; var obj = new a(); log(a.a1); log(this.a2); log(a.a2); log(a.a3); log(a.a4); log(a.hello); // X log("-------------------------"); log(obj.a1); log(obj.a2); log(obj.a4); // X log(obj.hello); // X log(obj.b1); log(obj.b2());

[/code]

有疑問的是
log(a.hello); 請問 a.prototype.hello 和 a.hello 有何不同
log(obj.a4); 列印出來為什麼不等於 a4
log(obj.hello); 列印出來為什麼不等於 a5

請大俠幫忙解惑一下

謝謝

1>.
a.prototype.hello是a这一个函数所产生的对象的hello属性.
a.hello则是a这个函数自身的hello属性.
两都者没有关系.
所以a.hello会输出undifine;

2>.
你函数a中的这段代码:
[code="js"]return {

b1:'b1',

b2:function() {

alert("this in b2 " + this + " a1:" + a1 + " a2:");

return "b2 ,this.a1=" + this.a1 + ",this.abc=" + this.abc ;
}

};[/code]
它说明了当通过var obj=new a();所创建的obj对象实际上是a函数所返回的那个匿名对象(即{}中的内容).而这个对象中只有两个属性b1和b2,其中b1是一个字符串,b2是一个函数.不存在名为a4的这个属性.所以输出值也为undefine;

3>.
第三个问题的出现的原因和问题2是一样的.由于a函数所返回的那个对象中不包含hello这个属性.所以会输出undefine;
楼主可以测试一下,将a函数中的return 语句去掉.那么a.prototype.hello这个属性就会起效果了.

推荐楼主看两篇JavaEye论坛上的帖子:
<领悟JavaScript中的面对对象>:
[url]http://www.iteye.com/topic/155109[/url]
:
[url]http://www.iteye.com/topic/205929[/url]

应该会对楼主有所帮助.