prototype属性为javascript对象扩展属性和方法
1、定义和用法
语法:object.prototype.name=value
prototype 属性使您有能力向对象添加属性和方法。
[实例]
<script type="text/javascript">
function employee(name,job,born)
{
this.name=name;
this.job=job;
this.born=born;
}
var bill=new employee("Bill Gates","Engineer",1985);
employee.prototype.salary=null;
bill.salary=20000;
document.write(bill.salary);
</script>
2、在脚本编写中的典型应用
2.1、为脚本环境内建对象添加方法
[程序代码]
Array.prototype.max = function()
{
var i, max = this[0];
for (i = 1; i < this.length; i++)
{
if (max < this[i])
max = this[i];
}
return max;
};
2.2、为用户自定义类添加方法
[程序代码]
function TestObject(name)
{
this.m_Name = name;
}
TestObject.prototype.ShowName = function()
{
alert(this.m_Name);
};
2.3、对象间实现继承
[程序代码]
function TestObjectA(){
this.MethodA=function(){alert("TestObjectA.methodA");};
}
function TestObjectB(){
this.MethodB=function(){alert("TestObjectB.methodb");};
}
TestObjectB.prototype=new TestObjectA();
//应用
var myobj=new TestObjectB();
myobj.MethodA();
//myobj.MethodB();
3、常用的JS对象扩展
3.1、为Number对象添加“数字相加”功能
语法:Number.add(num)
实现方法:Number.prototype.add = function(num){return(this+num);}
试验:alert((3).add(15)) -> 显示 18
3.2、为Boolean对象添加“布尔值取反”功能
语法:Boolean.rev()
实现方法:Boolean.prototype.rev = function(){return(!this);}
试验:alert((true).rev()) -> 显示 false
3.3、为Array对象添加“在数组末尾加入一个新的元素”功能
语法:Array.push(new_element)
实现方法:
Array.prototype.push = function(new_element){
this[this.length]=new_element;
return this.length;
}
//一次性为Array追加多个元素
Array.prototype.pushPro = function() {
var currentLength = this.length;
for (var i = 0; i < arguments.length; i++) {
this[currentLength + i] = arguments[i];
}
return this.length;
}
3.4、为String对象添加全/半角识别功能
由于 JavaScript 将全角、半角均视为是一个字符,在一些实际运用中可能会造成一定的问题,现在我们通过 prototype 来弥补这部不足。
语法:String.cnLength
实现方法:
String.prototype.cnLength = function(){
var arr=this.match(/[^\x00-\xff]/ig);
return this.length+(arr==null?0:arr.length);
}
试验:alert("EaseWe空间Spaces".cnLength()) -> 显示 16
[截取字符串,从字符串左边截取num个字符,并支持全角半角字符的区分]
语法:String.left(num,mode)
实现方法:
String.prototype.left = function(num,mode){
if(!/\d+/.test(num))return(this);
var str = this.substr(0,num);
if(!mode) return str;
var n = str.cnLength() - str.length;
num = num - parseInt(n/2);
return this.substr(0,num);
}
试验:
alert("jishu空间Spaces".left(8)); -> 显示: jishu空间S
alert("jishu空间Spaces".left(8,true)); -> 显示: jishu空间
3.5、计算出两个日期型变量的间隔时间(年、月、日、周)
语法:Date.DayDiff(Date)
实现方法:
Date.prototype.DayDiff = function(cDate,mode){
try{
cDate.getYear();
}catch(e){
return(0);
}
var base =60*60*24*1000;
var result = Math.abs(this - cDate);
switch(mode){
case "y":
result/=base*365;
break;
case "m":
result/=base*365/12;
break;
case "w":
result/=base*7;
break;
default:
result/=base;
break;
}
return(Math.floor(result));
}
试验:alert((new Date()).DayDiff((new Date(2002,0,1)))) -> 显示: 以日计算的时间差
alert((new Date()).DayDiff((new Date(2002,0,1)),"m")) -> 显示:以月计算的时间差
当然,也可以进一步扩充,得出响应的小时、分钟,甚至是秒。
3.6、计算某一数字的阶乘
语法:Number.fact()
实现方法:
Number.prototype.fact=function(){
var num = Math.floor(this);
if(num<0)return NaN;
if(num==0 || num==1)
return 1;
else
return (num*(num-1).fact());
}
试验:alert((4).fact()) 显示: 24