资料整理

 

了解Prototype

1、最简单的例子,了解 prototype:
(1) Number.add(num):作用,数字相加
实现方法:Number.prototype.add = function(num){return(this+num);}
试验:alert((3).add(15)) -> 显示 18


(2) Boolean.rev(): 作用,布尔变量取反
实现方法:Boolean.prototype.rev = function(){return(!this);}
试验:alert((true).rev()) -> 显示 false

是不是很简单?这一节仅仅是告诉读者又这么一种方法,这种方法是这样运用的。


2、已有方法的实现和增强,初识 prototype:
(1) Array.push(new_element)
  作用:在数组末尾加入一个新的元素
  实现方法:
  Array.prototype.push = function(new_element){
        this[this.length]=new_element;
        return this.length;
    }
  让我们进一步来增强他,让他可以一次增加多个元素!
  实现方法:
  Array.prototype.pushPro = function() {
        var currentLength = this.length;
        for (var i = 0; i < arguments.length; i++) {
            this[currentLength + i] = arguments[i];
        }
        return this.length;
    }
  应该不难看懂吧?以此类推,你可以考虑一下如何通过增强 Array.pop 来实现删除任意位置,任意多个元素(具体代码就不再细说了)

(2) String.length
  作用:这实际上是 String 类的一个属性,但是由于 JavaScript 将全角、半角均视为是一个字符,在一些实际运用中可能会造成一定的问题,现在我们通过 prototype 来弥补这部不足。
  实现方法:
  String.prototype.Tlength = function(){
        var arr=this.match(/[^\x00-\xff]/ig);
        return this.length+(arr==null?0:arr.length);
    }
  试验:alert("aa啦啦aa".Tlength()) -> 显示 8
  这里用到了一些正则表达式的方法和全角字符的编码原理,由于属于另两个比较大的类别,本文不加说明,请参考相关材料。


3、新功能的实现,深入 prototype:在实际编程中所用到的肯定不只是已有方法的增强,更多的实行的功能的要求,下面我就举两个用 prototype 解决实际问题的例子:
(1) String.left()
  问题:用过 vb 的应该都知道left函数,从字符串左边取 n 个字符,但是不足是将全角、半角均视为是一个字符,造成在中英文混排的版面中不能截取等长的字符串
  作用:从字符串左边截取 n 个字符,并支持全角半角字符的区分
  实现方法:
  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.Tlength() - str.length;
        num = num - parseInt(n/2);
        return this.substr(0,num);
    }
  试验:alert("aa啦啦aa".left(4)) -> 显示 aa啦啦
     alert("aa啦啦aa".left(4,true)) -> 显示 aa啦
  本方法用到了上面所提到的String.Tlength()方法,自定义方法之间也能组合出一些不错的新方法呀!

(2) Date.DayDiff()
  作用:计算出两个日期型变量的间隔时间(年、月、日、周)
  实现方法:
  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)))) -> 显示 329
     alert((new Date()).DayDiff((new Date(2002,0,1)),"m")) -> 显示 10
  当然,也可以进一步扩充,得出响应的小时、分钟,甚至是秒。

(3) 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
  这个方法主要是说明了递归的方法在 prototype 方法中也是可行的!





扩展代码1:
<script>
/*
 This following code are designed and writen by Windy_sk <seasonx@163.net>
 You can use it freely, but u must held all the copyright items!
*/

//测字符串实际长度
String.prototype.Tlength = function(){var arr=this.match(/[^\x00-\xff]/ig);return this.length+(arr==null?0:arr.length);}

//字符串左取
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.Tlength() - str.length;num = num - parseInt(n/2);return this.substr(0,num);}

//字符串右取
String.prototype.right = function(num,mode){if(!/\d+/.test(num))return(this);var str = this.substr(this.length-num);if(!mode) return str;var n = str.Tlength() - str.length;num = num - parseInt(n/2);return this.substr(this.length-num);}

//字符串包含
String.prototype.GetCount = function(str,mode){return eval("this.match(/("+str+")/g"+(mode?"i":"")+").length");}

//字符串去除两端空字符
String.prototype.Trim=function(){return this.replace(/(^\s*)|(\s*$)/g,"");}
String.prototype.Ltrim = function(){return this.replace(/(^\s*)/g, "");}
String.prototype.Rtrim = function(){return this.replace(/(\s*$)/g, "");}

document.write("'aa啦啦aa'.Tlength() = " + "aa啦啦aa".Tlength());
document.write("<br>");
document.write("'aabbcc'.Tlength() = " + "aabbcc".Tlength());
document.write("<br>");
document.write("'aa啦啦aa'.left(4) = " + "aa啦啦aa".left(4));
document.write("<br>");
document.write("'aa啦啦aa'.left(4,true) = " + "aa啦啦aa".left(4,true));
document.write("<br>");
document.write("'aa啦啦aa'.right(4) = " + "aa啦啦aa".right(4));
document.write("<br>");
document.write("'aa啦啦aa'.right(4,true) = " + "aa啦啦aa".right(4,true));
document.write("<br>");
document.write("'abAcae'.GetCount('a') = " + "abAcae".GetCount("a"));
document.write("<br>");
document.write("'abAcae'.GetCount('a',true) = " + "abAcae".GetCount("a",true));
document.write("<br>");
document.write("'  abc  de    '.Ltrim() = " + "  abc  de    ".Ltrim());
document.write("<br>");
document.write("'  abc  de    '.Rtrim() = " + "  abc  de    ".Rtrim());
document.write("<br>");
document.write("'  abc  de    '.Trim() = " + "  abc  de    ".Trim());
</script>




代码2:
/*Number Object*/
if(!Number.prototype.toFixed) {
 Number.prototype.toFixed = function(n) {
  with(Math) return round(Number(this)*pow(10,n))/pow(10,n)
 }
}
/*Array Object*/
if (!Array.prototype.pop) {
 Array.prototype.pop = function() {
  var lastElement = this[this.length-1];
  this.length = Math.max(this.length-1,0);
  return lastElement;
 }
}
if (!Array.prototype.push) {
 Array.prototype.push = function() {
  for(var i=0;i<arguments.length;i++) {
   this[this.length]=arguments[i];
  }
  return this.length;
 }
}
if (!Array.prototype.shift) {
 Array.prototype.shift = function() {
  var firstElement = this[0];
  this.reverse();
  this.pop();
  this.reverse();
  return firstElement;
 }
}
if (!Array.prototype.splice) {
 Array.prototype.splice = function() {
  var start = arguments[0];
  var deleteCount = start+arguments[1];
  var deleteItem = this.slice(start,deleteCount);
  var beforeItem = this.slice(0,start);
  var afterItem = this.slice(deleteCount);
  this.length=beforeItem.length;
  var i;
  for (i=2;i<arguments.length;this[this.length]=arguments[i++]);
  for (i=0;i<afterItem.length;this[this.length]=afterItem[i++]);
  return deleteItem;
 }
}
if (!Array.prototype.unshift) {
 Array.prototype.unshift = function() {
  var arr = new Array();
  for (var i=0;i<arguments.length;arr[i]=arguments[i++]);
  arr = arr.concat(this);
  this.length = 0;
  for (i=0;i<arr.length;this[i]=arr[i++]);
 }
}



代码3:
function getCookie(mainKey,subKey) {
 var reg = new RegExp("(^| )"+mainKey+"=([^;]*)(;|$)");
 var arr = document.cookie.match(reg);
 if (arguments.length == 2) {
  if (arr!=null)
   return key(subKey,arr[2]);
  else
   return null;
 } else if (arguments.length == 1) {
  if (arr!=null)
   return unescape(arr[2]);
  else
   return null;
 }

 function key(subKey,findWith) {
  var arr,reg = new RegExp("(^| |&)"+subKey+"=([^&]*)(&|$)");
  var findWith = findWith?findWith:document.cookie;
  if (arr =  findWith.match(reg))
   return unescape(arr[2]);
  else
   return null;
 }
}

function getQuery(name) {
 var reg = new RegExp("(^|&)"+name+"=([^&]*)(&|$)");
 var r = location.search.substr(1).match(reg)
 if (r!=null) return unescape(r[2]);
}

function DateAdd(strInterval, NumDay, dtDate) {
 var dtTmp = new Date(dtDate);
 if (isNaN(dtTmp)) dtTmp = new Date();
 switch (strInterval) {
  case "s":return new Date(Date.parse(dtTmp) + (1000 * NumDay));
  case "n":return new Date(Date.parse(dtTmp) + (60000 * NumDay));
  case "h":return new Date(Date.parse(dtTmp) + (3600000 * NumDay));
  case "d":return new Date(Date.parse(dtTmp) + (86400000 * NumDay));
  case "w":return new Date(Date.parse(dtTmp) + ((86400000 * 7) * NumDay));
  case "m":return new Date(dtTmp.getFullYear(), (dtTmp.getMonth()) + NumDay, dtTmp.getDate(), dtTmp.getHours(), dtTmp.getMinutes(), dtTmp.getSeconds());
  case "y":return new Date((dtTmp.getFullYear() + NumDay), dtTmp.getMonth(), dtTmp.getDate(), dtTmp.getHours(), dtTmp.getMinutes(), dtTmp.getSeconds());
 }
}
// DateDiff("m","2002/12/1 00:00:00","2004/12/1 00:00:00")
function DateDiff(strInterval, dtStart, dtEnd) {
 var dtStart = new Date(dtStart);
 if (isNaN(dtStart)) dtStart = new Date();
 var dtEnd = new Date(dtEnd);
 if (isNaN(dtEnd)) dtEnd = new Date();
 switch (strInterval) {
  case "s":return parseInt((dtEnd - dtStart) / 1000);
  case "n":return parseInt((dtEnd - dtStart) / 60000);
  case "h":return parseInt((dtEnd - dtStart) / 3600000);
  case "d":return parseInt((dtEnd - dtStart) / 86400000);
  case "w":return parseInt((dtEnd - dtStart) / (86400000 * 7));
  case "m":return (dtEnd.getMonth()+1)+((dtEnd.getFullYear()-dtStart.getFullYear())*12) - (dtStart.getMonth()+1);
  case "y":return dtEnd.getFullYear() - dtStart.getFullYear();
 }
}
// b2s("11新浪网!@#程序员_+}{:><")
function b2s(strng) {
 var Matches = strng.match(/[\x21-\x7e]/g);
 for (var i=0;i<Matches.length;i++) {
  strng = strng.replace(Matches[i],String.fromCharCode(Matches[i].charCodeAt (0)+65248))
 }
 return strng;
}






出处:http://bbs.blueidea.com/viewthread.php?tid=716195&page=

posted on 2006-07-29 10:46 谢玮 阅读(238) 评论(0)  编辑  收藏 所属分类: javascript


只有注册用户登录后才能发表评论。


网站导航:
 

导航

统计

常用链接

留言簿(1)

随笔档案

文章分类

文章档案

搜索

最新评论