javascript的类静态属性是个好玩的东西,它不同于java等语言
在java中,比如一个Person类里有一个static属性,在所有的对象中拥有的是同一个地址空间,也就是说:
通过对象改变static属性,也会导致其它对象的该属性的值的改变
在javascript中,情况有所不同,如以下代码:
function Person(name,age) {
this.name = name; //属性
this.age = age; //属性 //方法
this.show = function() {
alert("name:" + this.name + ";age:" + this.age);
}
}
Person.prototype.totalCount = 8;//静态属性
Person.showTotalCount = function() {//静态方法
alert(Person.prototype.totalCount);
}
var me = new Person("Freish",23);
me.totalCount++; //通过对象改变totalCount的值 alert(me.totalCount);//这里是9,没有任何疑问
Person.showTotalCount();//然而,类的静态属性的值却没有改变!依旧是8
通过多次实验,总结如下:
类的静态变量属于类本身,而不属于对象,但是可以通过对象来访问(获取类静态属性的值)。如果通过对象给类静态属性赋值(包括++和--),那么将会为该对象创建一个独有的变量,而操作结果将保存在这个新建的对象变量中;赋值后,将不能通过该对象来访问那个类静态属性了,而只能访问到那个新建的变量!
分析以下上面例子中的me.totalCount++;
me.totalCount++大致等价于me.totalCount = me.totalCount+1;
在等号右边,me.totalCount取的是类的静态属性totalCount的值,因为此时还没有给对象me的totalCount赋值;
加1后赋值,此时为对象me创建了一个自己的变量totalCount,并将结果给这个新的变量,而没有改变类静态变量totalCount的值。
这样,再通过me.totalCount将访问到的是这个新创建的变量了!
在java中,比如一个Person类里有一个static属性,在所有的对象中拥有的是同一个地址空间,也就是说:
通过对象改变static属性,也会导致其它对象的该属性的值的改变
在javascript中,情况有所不同,如以下代码:
function Person(name,age) {
this.name = name; //属性
this.age = age; //属性 //方法
this.show = function() {
alert("name:" + this.name + ";age:" + this.age);
}
}
Person.prototype.totalCount = 8;//静态属性
Person.showTotalCount = function() {//静态方法
alert(Person.prototype.totalCount);
}
var me = new Person("Freish",23);
me.totalCount++; //通过对象改变totalCount的值 alert(me.totalCount);//这里是9,没有任何疑问
Person.showTotalCount();//然而,类的静态属性的值却没有改变!依旧是8
通过多次实验,总结如下:
类的静态变量属于类本身,而不属于对象,但是可以通过对象来访问(获取类静态属性的值)。如果通过对象给类静态属性赋值(包括++和--),那么将会为该对象创建一个独有的变量,而操作结果将保存在这个新建的对象变量中;赋值后,将不能通过该对象来访问那个类静态属性了,而只能访问到那个新建的变量!
分析以下上面例子中的me.totalCount++;
me.totalCount++大致等价于me.totalCount = me.totalCount+1;
在等号右边,me.totalCount取的是类的静态属性totalCount的值,因为此时还没有给对象me的totalCount赋值;
加1后赋值,此时为对象me创建了一个自己的变量totalCount,并将结果给这个新的变量,而没有改变类静态变量totalCount的值。
这样,再通过me.totalCount将访问到的是这个新创建的变量了!