猿问

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

 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行又是对的?

万千封印
浏览 518回答 6
6回答

撒科打诨

问: 在函数Car中 这样Car._initialized 声明的属性 这个属性到底是静态属性,还是实例属性? 答: 静态属性,更准确的说应该叫 类属性。 问:如果是静态属性为什么 14行报错? 答: Javascript是纯动态的语言和Java之类的不一样,java是预先编译好类的结构的,如果是java 使用静态变量不用new 类直接用类名就可以访问变量,而javascript却必须new function,否则是执行不到代码,变量也就不会存在。就是说javascript里function中的变量不执行是不存在的。所以必须先new Car 静态变量 Car._initialized 才会存在。new过之后你才能访问到这个变量。 问:如果是实例属性 18行为什么?  而在声明对象ca后 17行又是对的? 答:不是实例属性;上面已经做出回答。 记得加分啊哈哈。

达令说

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

千巷猫影

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

哆啦的时光机

只是 标识  是Car的属性吗?

胡说叔叔

@李凡: 是的咧。所以不要多想了,哈哈。
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答