为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

万千封印 2018-12-07 05:30:51
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行又是对的?
查看完整描述

6 回答

?
撒科打诨

TA贡献1934条经验 获得超2个赞

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

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

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

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

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

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

记得加分啊哈哈。

查看完整回答
反对 回复 2018-12-24
?
达令说

TA贡献1821条经验 获得超6个赞

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

查看完整回答
反对 回复 2018-12-24
?
千巷猫影

TA贡献1829条经验 获得超7个赞

 Car._initialized = true;最好不要看这一句。整个例子是一个动态原型方式。
加上这么一句的作用,只在于当第一次构造函数时,会生成相应的方法,再次生成是,因为是ture了,所以就避免了重复。它的作用,有点像标识而已。
查看完整回答
反对 回复 2018-12-24
?
哆啦的时光机

TA贡献1779条经验 获得超6个赞

只是 标识  是Car的属性吗?

查看完整回答
反对 回复 2018-12-24
?
胡说叔叔

TA贡献1804条经验 获得超8个赞

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

查看完整回答
反对 回复 2018-12-24
  • 6 回答
  • 0 关注
  • 517 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号