静态成员,静态类
因为某些对象的特定行为是不变的(如math类里面的方法只有一种运算,月亮只有一个)所以无需实例化就可以直接调用
注意
允许在同一类中定义同名的静态属性和实例属性
不能再静态方法中使用this关键字,所以静态方法只能访问静态属性,静态方法也不能被继承
如果一个类中的成员全部是静态成员,那么就可以说该类为静态类
静态方法只能访问静态属性,不能访问实例属性。
静态成员最常用的功能就是创建枚举
创建静态成员
如果想把成员声明为静态的,只需将属性或者方法赋给类本身,就可以直接使用类无需创建实例就可以访问showInfo 和sex属性了,这两个成员都是静态成员
function Person(myName ,myAge){
this.name = myName;
this.age= myAge;
}
Person.showInfo = function(){
return();
};
Person.sex= "男";
静态成员的一种用途是保留有关类及其实例的状态信息,仅初始化一次。
function Count(){
document.write();
Count.i++;
}
Count.i=0;
初始化为0以后每次调用就会加一
静态成员不能被继承,可以传播到当前类的子类,在子类体中,不必引用在其中定义静态属性或方法的类,就可以使用静态属性或方法
使用静态成员的注意事项
js允许在同一类中定义同名的静态属性和实例属性
function Count(){
this.i=1;
}
Count.i=0;
document.write("Count静态属性:"+Count.i);//输出0
var ocount= new Count();
document.write("Count实例属性:"+Count.i);//输出1
多态-----重载和覆载
js不支持直接定义多个方法来实现重载,因为它不允许存在同名的两个方法。用户可以利用变参数来实现重载功能,
function Over(){}
Over.prototype.myMethod= function(){
var len= arguments.length;
if(len==2){
document.write();
}else if(len==3){
document.write();
}else{
throw new Error();
}
};
try{
var oOver= new Over();
oOver.myMethod(1,2);
oOver.myMethod(1,2,3);
}catch(err){
document.write(err.message);
}
定义了一个类,事项了一个名为myMethod的方法,通过自行判断参数的数量实现重载
方法的覆载
从基类中继承功能时,子类可以继承基类的所有方法和属性,有时子类需要实现新的功能,可以在新类中覆盖基类的方法,
无需使用新的名称,只需为子类新定义一个同名的方法成员就可以
原型链本质论
每个类都有一个prototype属性,这是一个静态属性,该属性值包含了标识该类的一个对象,这个对象称为原型对象
在原型对象上定义了一些内部属性用于描述该类,其中就包含该类的基类的信息,通过信息【Prototype】,js解释引擎就可以知道该类的基类,同理基类也是一样,
就会建立起一个链条
在原型对象上定义了一些内部属性【Prototype】(的值为null)用于描述该类,其中就包含该类的基类的信息
当一个类定义是,它有原型对象,原型对象必须声明有多个内部特定的属性【Prototype】和【class】,作为类的特性
内部属性
【Prototype】属性表示该类的父类是原型对象,一般使用_proto_来访问
【class】"Arguments","Array"
Child是Person是的子类
function Person(){}
function Child(){}
Child.prototype = new Person();
Person.prototype._proto ===Object.prototype;
Child.prototype._proto_ ===object.prototype;//不继承类Person时成立
如果继承了原型链就会下移
Child.Prototype._proto_._proto_ ===Object.prototype