JSにおけるプロトタイプの紹介と使用


参照
        js自体は対象に向けた言語であり、それに関わる要素はその属性によっていくつかの特定の種類に依存する.私たちの一般的なクラスは、配列変数(Aray)、論理変数(Boolean)、日付変数(Date)、構造変数(Function)、数値変数(Number)、オブジェクト変数(Object)、文字列変数(String)などであり、関連する種類の方法は、プログラマーがよく使う(ここではクラスの注意と属性と方法を区別します).日付のgetシリーズの方法、文字列のsplitメソッドなど.しかし、実際のプログラミングの過程で、既存の方法の不足を感じましたか?このようにprototype方法が生まれました.        jsのオブジェクトのprototype属性は、オブジェクトタイプの原型に戻るための参照であることを知っています.私たちはprototype属性を使って対象のクラスの基本機能を提供します.また、オブジェクトの新規実例会では、オブジェクトの原型を「継承」する操作が行われます.すべてのjsの内部オブジェクトにはリードオンリーのprototype属性があります.そのプロトタイプには機能(属性と方法)を動的に追加することができますが、このオブジェクトは異なるプロトタイプを与えられません.しかし、ユーザが定義したオブジェクトは、新しいプロトタイプに割り当てられてもよい.すべてのオブジェクトにプロトタイプがあります.プロトタイプ自体も対象です.プロトタイプがあり、プロトタイプチェーンが形成されます.チェーンの中でnullに出会うとチェーンが終了します.objectのprototypeはnullです.

  ,            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.cnLength = function(){
        var arr=this.match(/[^\x00-\xff]/ig);
        return this.length+(arr==null?0:arr.length);
}

  :

	alert("EaseWe   Spaces".cnLength()) ->    16

	                         ,             ,      ,       。


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("EaseWe  Spaces".left(8)) ->    EaseWe  
	alert("EaseWe  Spaces".left(8,true)) ->    EaseWe 
	             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         !