《Javascript权威指南》学习笔记之八:静态成员、静态类、枚举、重载和覆盖

一、创建静态成员

       直接将属性或者方法赋给类本身

[javascript] view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. function Person(name,age) 
  2.     this.myname = name; 
  3.     this.age = age; 
  4. Person.showInfo = function()               //静态方法,只能访问静态属性 
  5.     return ("我的性别是:"+Person.sex); 
  6. }; 
  7. var per = new Person("yuan",20); 
  8. Person.sex = "男";                         //静态属性 
  9. 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中允许定义同名的静态属性和实例属性,二者互相独立

[javascript] view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. function Person(name,age,sex) 
  2.     this.myname = name; 
  3.     this.age = age; 
  4.     this.sex = sex; 
  5. Person.showInfo = function()               //静态方法,只能访问静态属性 
  6.     return ("我的性别是:"+Person.sex); 
  7. }; 
  8. var per = new Person("yuan",20,"女"); 
  9. Person.sex = "男";                         //静态属性 
  10. 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,但是实例方法可以访问静态属性和实例属性

[javascript] view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. function Person(name,age,sex) 
  2.     this.myname = name; 
  3.     this.age = age; 
  4.     this.sex = sex; 
  5. Person.prototype.showInfo = function()               //静态方法,只能访问静态属性 
  6.     return ("我的性别是:"+Person.sex+"\n我的年龄是:"+this.age); 
  7. }; 
  8. var per = new Person("yuan",20,"女"); 
  9. Person.sex = "男";                         //静态属性 
  10. 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    如果一个类的成员全是静态成员,则这个类是静态类,不能被实例化。


三 、枚举:一组静态常量

[javascript] view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. function Day() 
  2.     throw new Error("这是静态类,不能实例化"); 
  3. Day.MONDAY = 1; 
  4. Day.TUE = 2; 
  5. Day.WED = 3; 
  6.  
  7. var date = new Date(); 
  8. var day = date.getDay(); 
  9. switch(day) 
  10.     case Day.MONDAY: 
  11.     alert("周一"); 
  12.     break
  13.     case Day.TUE: 
  14.     alert("周二"); 
  15.     break
  16.     case Day.WED: 
  17.     alert("周三"); 
  18.     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中的重载是通过参数的个数不同实现的

[javascript] view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. function OverLoad() 
  2.     this.method = function() 
  3.     { 
  4.         var len =  arguments.length; 
  5.         if(len == 2) 
  6.         { 
  7.             document.write("正在调用的是两个参数的方法<br/>"); 
  8.         } 
  9.         else if(len == 3) 
  10.         { 
  11.             document.write("正在调用的是三个参数的方法"); 
  12.         } 
  13.     } 
  14. try 
  15.     var over = new OverLoad; 
  16.     over.method(1,2); 
  17.     over.method(1,2,3); 
  18. catch(err) 
  19.     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   覆盖:用于继承中,指子类中定义了与父类中同名的方法,父类的同名方法被隐藏

[javascript] view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. //父类 
  2. function Father(myName,age) 
  3.     this.myname = myName; 
  4.     this.age = age; 
  5. Father.prototype.show = function() 
  6.     return("Father's name: "+this.myName+", and age: "+this.age); 
  7. }; 
  8.  
  9. //子类 
  10. function Child(myName,age) 
  11.     this.$super = Father;     //继承父类 
  12.     this.$super(myName,age);  //调用父类的构造方法 
  13.     this.show = function() 
  14.     { 
  15.         return ( "Child's age: "+this.age); 
  16.     }; 
  17. Child.prototype = new Father(); 
  18. var child = new Child("yuan",20); 
  19. 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());

运行结果:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值