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

posted @ 2011-05-21 11:26  飞虎cnblog  阅读(3283)  评论(0编辑  收藏  举报
友情链接:技术迷 | JSM官方博客 | 阿旭博客 | 有声小说在线听