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行又是对的?
问: 在函数Car中 这样Car._initialized 声明的属性 这个属性到底是静态属性,还是实例属性?
答: 静态属性,更准确的说应该叫 类属性。
问:如果是静态属性为什么 14行报错?
答: Javascript是纯动态的语言和Java之类的不一样,java是预先编译好类的结构的,如果是java 使用静态变量不用new 类直接用类名就可以访问变量,而javascript却必须new function,否则是执行不到代码,变量也就不会存在。就是说javascript里function中的变量不执行是不存在的。所以必须先new Car 静态变量 Car._initialized 才会存在。new过之后你才能访问到这个变量。
问:如果是实例属性 18行为什么? 而在声明对象ca后 17行又是对的?
答:不是实例属性;上面已经做出回答。
记得加分啊哈哈。
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添加属性!
把11行从函数中拿出来再看看,也许你就明白了
Car._initialized = true;最好不要看这一句。整个例子是一个动态原型方式。
加上这么一句的作用,只在于当第一次构造函数时,会生成相应的方法,再次生成是,因为是ture了,所以就避免了重复。它的作用,有点像标识而已。
只是 标识 是Car的属性吗?
@李凡: 是的咧。所以不要多想了,哈哈。
1.在函数内部 如果不用var 声明变量, 变量会绑定到全局变量即 window.Car._initialized = true 注意Car是函数
不调用里面的代码是不会执行的。
所以14是undefinde 15行执行过后17行是true
2.构造器调用模式
若果一个函数前面加上new来调用 那么会产生一个新的对象,this将会绑定到这个新的对象上去。
这样说不知道lz理解了没有。