//静态属性:静态属性又称公共属性,它不属于某个类的实例,而是直接属于某个类。
function user(name)
{
this.Name = name ; //实例属性
}
user.prototype.age = 0; //静态属性
user.prototype.birthday = function(){//静态方法
this.age++;
//这里是this ,而不是 user.prototype.age++;
}
var XiaoWang = new user("小王");//小王
var XiaoLiu = new user("小刘");//小刘
alert(XiaoWang.age); // 0 ;
alert(XiaoLiu.age); // 0 ;
XiaoWang.birthday();//小王过生日了。此时小王已经 拥有了一个 自己的 age 属性, 不需要再去原型中寻找。 [b]?????这个地方实在看不懂?能否解释下? [/b]
XiaoWang.age++; // 跟 birthday() 方法 同理[b]。?????这个地方实在看不懂?能否解释下?为什么XiaoWang.age++,就有了自己的age属性了 [/b]
user.prototype.birthday();
alert(XiaoWang.age); // 2 ;
alert(XiaoLiu.age); // 1 ;
/*
首先我们解释 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 .
*/
[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]