[b]问题补充:[/b]
[color=red]
经过一番思考我认为这个问题的关键如下。
user.prototype.birthday = function(){//静态方法
this.age++; }
//这是整个问题的核心,先回归javascript最基本的概念,就是如何定义一个对象的属性,直接obj.属性名=属性值。就为obj新增了一个属性。this.age++可以理解为this.age=this.age+1;当执行this.age+1时,会从它的原型属性中找到this.age=1,而当这个值赋给this.age的时候,就向前面所说的如何定义一个对象的属性。这时this有了自己的属性age,而不再从原型中查找。不知我理解的对不对,请各们大侠拍砖。。。
[/color]
改成[code="js"]user.prototype.birthday = function(){
if(!this.age){
this.age = 0;
}
this.age += 1;
} [/code]
然后
[code="js"]alert(XiaoWang.hasOwnProperty("age"));
XiaoWang.birthday();
alert(XiaoWang.hasOwnProperty("age"));[/code]
再看不明白的话,就先去看看基础的吧,可能是this.age++;这个有点魔幻,去查查ecma-262,估计就是我写的那个意思
[code="java"]
//静态属性:静态属性又称公共属性,它不属于某个类的实例,而是直接属于某个类。 function user(name) { this.Name = name ; //实例属性 } user.prototype.age = 0; //[color=red]原型属性不是静态属性和Name属性是一样的[/color] user.prototype.birthday = function(){//[color=red]原型方法不是静态方法[/color] this.age++; //这里是this ,而不是 user.prototype.age++; } /*这种才是静态方法 user.birthday = function(){ alert("静态方法"); }; */ var XiaoWang = new user("小王");//小王[color=red]就是user类的一个具体实例[/color] var XiaoLiu = new user("小刘");//小刘 alert(XiaoWang.age); // 0 ; alert(XiaoLiu.age); // 0 ; XiaoWang.birthday();//[color=red]此是因为用"小王"实例去调用原型方法就变成调用"小王"实例的实例方法birthday[/color] XiaoWang.age++; // [color=red]此是因为用"小王"实例去调用原型属性就变成调用"小王"实例的实例属性[/color] //user.birthday(); user.prototype.birthday();//[color=red]对原型方法的调用,会修改所有还没调用实例方法和实例属性的变量[/color] alert(XiaoWang.age); // 2 ; alert(XiaoLiu.age); // 1 ;[color=red]因为"小刘"从来没调用birthday()所以user.prototype.birthday()会影响它[/color] alert(user.prototype.age);//[color=red]user.prototype.birthday()所影响的user.prototype.age原型属性[/color] /* 首先我们解释 XiaoWang.age 为什么是2?而不是3? 在前面的过程中,XiaoWang.birthday(); 在这一步后, 其实小王已经拥有了属性age,也就是说已经为小王创建了一个跟静态属性同名的 实例属性。 所以当 user.prototype.birthday()这之后, XiaoWang.age并不会 +1 ,不管原型如何变化,都跟他无关了。 而为什么XiaoLiu.age是 1 呢 ? 因为小刘没有自己的实例属性age,所以他会到原型中寻找 名称为age的静态属性。 静态属性通过user.prototype.birthday()进行了 +1 , 所以XiaoLiu.age是 1 . */[/code]
//静态属性:静态属性又称公共属性,它不属于某个类的实例,而是直接属于某个类。 function user(name) { this.Name = name ; //实例属性 } user.prototype.age = 0; //[color=red]原型属性不是静态属性和Name属性是一样的[/color] user.prototype.birthday = function(){//[color=red]原型方法不是静态方法[/color] this.age++; //这里是this ,而不是 user.prototype.age++; } /*这种才是静态方法 user.birthday = function(){ alert("静态方法"); }; */ var XiaoWang = new user("小王");//小王[color=red]就是user类的一个具体实例[/color] var XiaoLiu = new user("小刘");//小刘 alert(XiaoWang.age); // 0 ; alert(XiaoLiu.age); // 0 ; XiaoWang.birthday();//[color=red]此是因为用"小王"实例去调用原型方法就变成调用"小王"实例的实例方法birthday[/color] XiaoWang.age++; // [color=red]此是因为用"小王"实例去调用原型属性就变成调用"小王"实例的实例属性[/color] //user.birthday(); user.prototype.birthday();//[color=red]对原型方法的调用,会修改所有还没调用实例方法和实例属性的变量[/color] alert(XiaoWang.age); // 2 ; alert(XiaoLiu.age); // 1 ;[color=red]因为"小刘"从来没调用birthday()所以user.prototype.birthday()会影响它[/color] alert(user.prototype.age);//[color=red]user.prototype.birthday()所影响的user.prototype.age原型属性[/color] /* 首先我们解释 XiaoWang.age 为什么是2?而不是3? 在前面的过程中,XiaoWang.birthday(); 在这一步后, 其实小王已经拥有了属性age,也就是说已经为小王创建了一个跟静态属性同名的 实例属性。 所以当 user.prototype.birthday()这之后, XiaoWang.age并不会 +1 ,不管原型如何变化,都跟他无关了。 而为什么XiaoLiu.age是 1 呢 ? 因为小刘没有自己的实例属性age,所以他会到原型中寻找 名称为age的静态属性。 静态属性通过user.prototype.birthday()进行了 +1 , 所以XiaoLiu.age是 1 . */user.prototype.birthday();[color=red]//对原型方法的调用,会修改所有还没调用实例方法和实例属性的变量 [/color]
这句太TMD怪异了,我靠。怎么能有这么怪异的表达呢,真想不通。实例化所有未实力的对象?
代码规范实在不堪入目... :?