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行又是对的?
答:不是实例属性;上面已经做出回答。
记得加分啊哈哈。

千巷猫影
TA贡献1829条经验 获得超7个赞
Car._initialized = true;最好不要看这一句。整个例子是一个动态原型方式。
加上这么一句的作用,只在于当第一次构造函数时,会生成相应的方法,再次生成是,因为是ture了,所以就避免了重复。它的作用,有点像标识而已。
添加回答
举报
0/150
提交
取消