一、创建静态成员
直接将属性或者方法赋给类本身
- function Person(name,age)
- {
- this.myname = name;
- this.age = age;
- }
- Person.showInfo = function() //静态方法,只能访问静态属性
- {
- return ("我的性别是:"+Person.sex);
- };
- var per = new Person("yuan",20);
- Person.sex = "男"; //静态属性
- alert(Person.showInfo());
function Person(name,age)
{
this.myname = name;
this.age = age;
}
Person.showInfo = function() //静态方法,只能访问静态属性
{
return ("我的性别是:"+Person.sex);
};
var per = new Person("yuan",20);
Person.sex = "男"; //静态属性
alert(Person.showInfo());
Google中运行结果:
也可以改为this.sex访问,结果相同。但是不可以用this.myname/this,age访问实例属性。
二 、注意事项
2.1 静态成员一般是公共成员,不能被继承,但可以在子类中直接使用
2.2 JS中允许定义同名的静态属性和实例属性,二者互相独立
- function Person(name,age,sex)
- {
- this.myname = name;
- this.age = age;
- this.sex = sex;
- }
- Person.showInfo = function() //静态方法,只能访问静态属性
- {
- return ("我的性别是:"+Person.sex);
- };
- var per = new Person("yuan",20,"女");
- Person.sex = "男"; //静态属性
- alert(Person.showInfo());
function Person(name,age,sex)
{
this.myname = name;
this.age = age;
this.sex = sex;
}
Person.showInfo = function() //静态方法,只能访问静态属性
{
return ("我的性别是:"+Person.sex);
};
var per = new Person("yuan",20,"女");
Person.sex = "男"; //静态属性
alert(Person.showInfo());
运行结果:
2.3 静态方法中不能访问实例属性,且不能使用关键字super,但是实例方法可以访问静态属性和实例属性
- function Person(name,age,sex)
- {
- this.myname = name;
- this.age = age;
- this.sex = sex;
- }
- Person.prototype.showInfo = function() //静态方法,只能访问静态属性
- {
- return ("我的性别是:"+Person.sex+"\n我的年龄是:"+this.age);
- };
- var per = new Person("yuan",20,"女");
- Person.sex = "男"; //静态属性
- alert(per.showInfo());
function Person(name,age,sex)
{
this.myname = name;
this.age = age;
this.sex = sex;
}
Person.prototype.showInfo = function() //静态方法,只能访问静态属性
{
return ("我的性别是:"+Person.sex+"\n我的年龄是:"+this.age);
};
var per = new Person("yuan",20,"女");
Person.sex = "男"; //静态属性
alert(per.showInfo());
运行结果:
2.4 如果一个类的成员全是静态成员,则这个类是静态类,不能被实例化。
三 、枚举:一组静态常量
- function Day()
- {
- throw new Error("这是静态类,不能实例化");
- }
- Day.MONDAY = 1;
- Day.TUE = 2;
- Day.WED = 3;
- var date = new Date();
- var day = date.getDay();
- switch(day)
- {
- case Day.MONDAY:
- alert("周一");
- break;
- case Day.TUE:
- alert("周二");
- break;
- case Day.WED:
- alert("周三");
- break;
- }
function Day()
{
throw new Error("这是静态类,不能实例化");
}
Day.MONDAY = 1;
Day.TUE = 2;
Day.WED = 3;
var date = new Date();
var day = date.getDay();
switch(day)
{
case Day.MONDAY:
alert("周一");
break;
case Day.TUE:
alert("周二");
break;
case Day.WED:
alert("周三");
break;
}
四、重载和覆盖
4.1 重载:在JS中,不允许有两个同名的方法,且参数没有数据类型,所以JS中的重载是通过参数的个数不同实现的
- function OverLoad()
- {
- this.method = function()
- {
- var len = arguments.length;
- if(len == 2)
- {
- document.write("正在调用的是两个参数的方法<br/>");
- }
- else if(len == 3)
- {
- document.write("正在调用的是三个参数的方法");
- }
- }
- }
- try
- {
- var over = new OverLoad;
- over.method(1,2);
- over.method(1,2,3);
- }
- catch(err)
- {
- document.write(err);
- }
function OverLoad()
{
this.method = function()
{
var len = arguments.length;
if(len == 2)
{
document.write("正在调用的是两个参数的方法<br/>");
}
else if(len == 3)
{
document.write("正在调用的是三个参数的方法");
}
}
}
try
{
var over = new OverLoad;
over.method(1,2);
over.method(1,2,3);
}
catch(err)
{
document.write(err);
}
运行结果
4.2 覆盖:用于继承中,指子类中定义了与父类中同名的方法,父类的同名方法被隐藏
- //父类
- function Father(myName,age)
- {
- this.myname = myName;
- this.age = age;
- }
- Father.prototype.show = function()
- {
- return("Father's name: "+this.myName+", and age: "+this.age);
- };
- //子类
- function Child(myName,age)
- {
- this.$super = Father; //继承父类
- this.$super(myName,age); //调用父类的构造方法
- this.show = function()
- {
- return ( "Child's age: "+this.age);
- };
- }
- Child.prototype = new Father();
- var child = new Child("yuan",20);
- alert(child.show());
//父类
function Father(myName,age)
{
this.myname = myName;
this.age = age;
}
Father.prototype.show = function()
{
return("Father's name: "+this.myName+", and age: "+this.age);
};
//子类
function Child(myName,age)
{
this.$super = Father; //继承父类
this.$super(myName,age); //调用父类的构造方法
this.show = function()
{
return ( "Child's age: "+this.age);
};
}
Child.prototype = new Father();
var child = new Child("yuan",20);
alert(child.show());
运行结果: