首页 新闻 会员 周边

JavaScript 上的 prototype this 迷惑,求解惑 分不多,谢谢

0
悬赏园豆:10 [已解决问题] 解决于 2012-11-08 11:29
 1 function logs(str){document.write(str+"<br />")}
 2 
 3 //动态原型方法的精髓在于使用 prototype 声明实例方法,使用 this 声明实例属性
 4 function Car(){
 5     this.color = "none"; //实例实属
 6     if( typeof Car._initialized == "undefined"){
 7         Car.prototype.showCar = function(){ //实例方法
 8             logs(this.color);
 9         }
10     }
11     Car._initialized = true; //静态属性 ? 实例属性?
12 }
13     logs(Car.color);           //undefined 
14     logs(Car._initialized); //undefined ?
15     var ca = new Car();
16     logs(ca.color);           //none
17     logs(Car._initialized); //true      ?
18     logs(ca._initialized);  //undefined ?
19     ca.showCar();           //none

14 17 18 行  

在函数Car中 这样Car._initialized 声明的属性 这个属性到底是静态属性,还是实例属性,

如果是静态属性为什么 14行报错?

如果是实例属性 18行为什么?  而在声明对象ca后 17行又是对的?

知识铺的主页 知识铺 | 初学一级 | 园豆:168
提问于:2012-05-25 17:40
< >
分享
最佳答案
1

问: 在函数Car中 这样Car._initialized 声明的属性 这个属性到底是静态属性,还是实例属性?

答: 静态属性,更准确的说应该叫 类属性。

问:如果是静态属性为什么 14行报错?

答: Javascript是纯动态的语言和Java之类的不一样,java是预先编译好类的结构的,如果是java 使用静态变量不用new 类直接用类名就可以访问变量,而javascript却必须new function,否则是执行不到代码,变量也就不会存在。就是说javascript里function中的变量不执行是不存在的。所以必须先new Car 静态变量 Car._initialized 才会存在。new过之后你才能访问到这个变量。

问:如果是实例属性 18行为什么?  而在声明对象ca后 17行又是对的?

答:不是实例属性;上面已经做出回答。

记得加分啊哈哈。

收获园豆:8
scofi | 初学一级 |园豆:92 | 2012-06-06 17:54

1,    logs(Car.color);之前你应该调用一下Car()这个方法!logs(Car._initialized);就不为undefined 的了。

2,   logs(Car._initialized),这时的Car应该是一个全局变量,那么你new的时候,已近执行了构造,为全局变量Car赋了 true,所以为true.

3,   logs(ca._initialized);  //undefined ? Car._initialized = true; Car是全局变量,你根本就没有在构造里面为this添加属性!

unbreakable | 园豆:111 (初学一级) | 2012-06-09 07:14
其他回答(3)
0

把11行从函数中拿出来再看看,也许你就明白了

~羽 | 园豆:218 (菜鸟二级) | 2012-05-26 21:08
0
 Car._initialized = true;最好不要看这一句。整个例子是一个动态原型方式。
加上这么一句的作用,只在于当第一次构造函数时,会生成相应的方法,再次生成是,因为是ture了,所以就避免了重复。它的作用,有点像标识而已。
icepy | 园豆:587 (小虾三级) | 2012-05-26 22:50

只是 标识  是Car的属性吗?

支持(0) 反对(0) 知识铺 | 园豆:168 (初学一级) | 2012-05-28 14:30

@李凡: 是的咧。所以不要多想了,哈哈。

支持(0) 反对(0) icepy | 园豆:587 (小虾三级) | 2012-05-28 15:24
0

 

1.在函数内部 如果不用var 声明变量, 变量会绑定到全局变量即 window.Car._initialized = true 注意Car是函数 

不调用里面的代码是不会执行的。

所以14是undefinde  15行执行过后17行是true

 

2.构造器调用模式
若果一个函数前面加上new来调用 那么会产生一个新的对象,this将会绑定到这个新的对象上去。

这样说不知道lz理解了没有。
收获园豆:2
codeyuyu | 园豆:224 (菜鸟二级) | 2012-07-06 16:11
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册