日期:2014-05-16 浏览次数:20308 次
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
function logs(str){document.write(str+"<br />")} //动态原型方法的精髓在于使用 prototype 声明实例方法,使用 this 声明实例属性 function Car(){ this.color = "none"; if( typeof Car._initialized == "undefined"){ Car.prototype.showCar = function(){ logs(this.color); } } Car._initialized = true; } /** * 以上代码创建了一个类Car,在js中,用函数表示类,而且函数也是一个对象。 * 该类有一个静态成员方法showCar,有一个实例成员属性color。 * 类的静态成员定义在类的原型属性--即prototype中,而类的原型属性也是一个对象。 * 类的实例成员定义在类的构造体中,即函数体内[this.xxx==]。 * * 关于_initialized,它是给类Car定义的一个暂时性属性变量,而不是类的任何成员属性或方法。 * _initialized的作用: * 1.每当new 一个Car对象时,就会顺序执行Car函数的每个语句。 * 2.按照操作1,如果没有_initialized这个(属性)变量的控制,每次建立Car的实例对象时都会修改类Car的prototype属性的showCar属性,即类Car的静态成员方法showCar */ logs(Car.color); //undefined Car是一个类(构造体函数),也是一个对象,它没有color属性。 logs(Car._initialized); //undefined ? 在new了第一个Car的实例后,Car函数体才会被执行过,而_initialized属性是在函数体内为Car加上的,所以是undefined var ca = new Car(); //new 了第一个Car的实例对象 logs(ca.color); //none //Car实例对象ca的属性color logs(Car._initialized); //true ?在new对象时执行了一边Car的函数体,执行完毕后Car的_initialized属性为true。 logs(ca._initialized); //undefined ?Car的实例成员和静态成员中均未定义_initialized属性,undefined。 ca.showCar(); //none /** * 要点: * 1.在js中,用函数表示类,而且函数也是一个对象。 * 2.类的静态成员定义在类的原型属性--即prototype中。 * 3.类的实例成员定义在类的构造体中,即函数体内[this.xxx==]定义。 * 4.任意对象都可以为其自定义属性,包括函数对象。 * 5.针对这个例子:_initialized是函数对象(类对象)Car的一个属性;color是类Car的实例成员;showCar是类Car的静态成员; */
------解决方案--------------------