亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

js中prototype用法詳細介紹

2019-11-20 21:42:18
字體:
來源:轉載
供稿:網友

prototype 是在 IE 4 及其以后版本引入的一個針對于某一類的對象的方法,而且特殊的地方便在于:它是一個給類的對象添加方法的方法!這一點可能聽起來會有點亂,別急,下面我便通過實例對這一特殊的方法作已下講解:

首先,我們要先了解一下類的概念,JavaScript 本身是一種面向對象的語言,它所涉及的元素根據其屬性的不同都依附于某一個特定的類。我們所常見的類包括:數組變量(Array)、邏輯變量(Boolean)、日期變量(Date)、結構變量(Function)、數值變量(Number)、對象變量(Object)、字符串變量(String) 等,而相關的類的方法,也是程序員經常用到的(在這里要區分一下類的注意和屬性發方法),例如數組的push方法、日期的get系列方法、字符串的split方法等等,
但是在實際的編程過程中不知道有沒有感覺到現有方法的不足?prototype 方法應運而生!下面,將通過實例由淺入深講解 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 方法中也是可行的!



JavaScript能夠實現的面向對象的特征有:
?公有屬性(public field)
?公有方法(public Method)
?私有屬性(private field)
?私有方法(private field)
?方法重載(method overload)
?構造函數(constructor)
?事件(event)
?單一繼承(single inherit)
?子類重寫父類的屬性或方法(override)
?靜態屬性或方法(static member)


例子一(JavaScript中允許添加行為的類型):可以在類型上使用proptotype來為類型添加行為。這些行為只能在類型的實例上體現。 JS中允許的類型有Array, Boolean, Date, Enumerator, Error, Function, Number, Object, RegExp, String

復制代碼 代碼如下:

<script type="text/javascript">  
Object.prototype.Property = 1;  
Object.prototype.Method = function ()  
{  
    alert(1);  
}  

var obj = new Object();  
alert(obj.Property);  
obj.Method();  
</script>  

<script type="text/javascript">
Object.prototype.Property = 1;
Object.prototype.Method = function (){ alert(1);}
var obj = new Object();
alert(obj.Property);
obj.Method();
</script>

例子二(prototype使用的限制):在實例上不能使用prototype,否則發生編譯錯誤
復制代碼 代碼如下:

<script type="text/javascript">  
var obj = new Object();  
obj.prototype.Property = 1; //Error 
//Error 
obj.prototype.Method = function()  
{  
    alert(1);  
}  
</script>  

<script type="text/javascript">var obj = new Object();obj.prototype.Property = 1; //Error//Errorobj.prototype.Method = function(){ alert(1);}</script>

例子三(如何定義類型上的靜態成員):可以為類型定義“靜態”的屬性和方法,直接在類型上調用即可
復制代碼 代碼如下:

<script type="text/javascript">  
Object.Property = 1;  
Object.Method = function()  
{  
    alert(1);  
}  

alert(Object.Property);  
Object.Method();  
</script>  

<script type="text/javascript">Object.Property = 1;Object.Method = function(){ alert(1);} alert(Object.Property);Object.Method();</script>

例子五():這個例子演示了通常的在JavaScript中定義一個類型的方法
復制代碼 代碼如下:

<script type="text/javascript">  
function Aclass()  
{  
this.Property = 1;  
this.Method = function()  
{  
    alert(1);  
}  
}  
var obj = new Aclass();  
alert(obj.Property);  
obj.Method();  
</script> 
<script type="text/javascript">function Aclass(){this.Property = 1;this.Method = function(){ alert(1);}}var obj = new Aclass();alert(obj.Property);obj.Method();</script>

例子六(JavaScript中允許添加行為的類型):可以在外部使用prototype為自定義的類型添加屬性和方法。
復制代碼 代碼如下:

<script type="text/javascript">  
function Aclass()  
{  
this.Property = 1;  
this.Method = function()  
{  
    alert(1);  
}  
}  
Aclass.prototype.Property2 = 2;  
Aclass.prototype.Method2 = function 
{  
    alert(2);  
}  
var obj = new Aclass();  
alert(obj.Property2);  
obj.Method2();  
</script>  

<script type="text/javascript">function Aclass(){this.Property = 1;this.Method = function(){ alert(1);}}Aclass.prototype.Property2 = 2;Aclass.prototype.Method2 = function{ alert(2);}var obj = new Aclass();alert(obj.Property2);obj.Method2();</script>

例子八():可以在對象上改變屬性。(這個是肯定的)也可以在對象上改變方法。(和普遍的面向對象的概念不同)
復制代碼 代碼如下:

<script type="text/javascript">  
function Aclass()  
{  
this.Property = 1;  
this.Method = function()  
{  
    alert(1);  
}  
}  
var obj = new Aclass();  
obj.Property = 2;  
obj.Method = function()  
{  
    alert(2);  
}  
alert(obj.Property);  
obj.Method();  
</script> 
<script type="text/javascript">function Aclass(){this.Property = 1;this.Method = function(){ alert(1);}}var obj = new Aclass();obj.Property = 2;obj.Method = function(){ alert(2);}alert(obj.Property);obj.Method();</script>

例子九():可以在對象上增加屬性或方法
復制代碼 代碼如下:

<script type="text/javascript">  
function Aclass()  
{  
this.Property = 1;  
this.Method = function()  
{  
    alert(1);  
}  
}  
var obj = new Aclass();  
obj.Property = 2;  
obj.Method = function()  
{  
    alert(2);  
}  
alert(obj.Property);  
obj.Method();  
</script>  

<script type="text/javascript">function Aclass(){this.Property = 1;this.Method = function(){ alert(1);}}var obj = new Aclass();obj.Property = 2;obj.Method = function(){ alert(2);}alert(obj.Property);obj.Method();</script>

例子十(如何讓一個類型繼承于另一個類型):這個例子說明了一個類型如何從另一個類型繼承。
復制代碼 代碼如下:

<script type="text/javascript">  
function AClass()  
{  
       this.Property = 1;  
       this.Method = function()  
       {  
              alert(1);  
       }  
}  

function AClass2()  
{  
       this.Property2 = 2;  
       this.Method2 = function()  
       {  
              alert(2);  
       }  
}  
AClass2.prototype = new AClass();  

var obj = new AClass2();  
alert(obj.Property);  
obj.Method();  
alert(obj.Property2);  
obj.Method2();  
</script>  

<script type="text/javascript">function AClass(){ this.Property = 1; this.Method = function() { alert(1); }} function AClass2(){ this.Property2 = 2; this.Method2 = function() { alert(2); }}AClass2.prototype = new AClass(); var obj = new AClass2();alert(obj.Property);obj.Method();alert(obj.Property2);obj.Method2();</script>

 例子十一(如何在子類中重新定義父類的成員):這個例子說明了子類如何重寫父類的屬性或方法。
復制代碼 代碼如下:

<script type="text/javascript">  
function AClass()  
{  
       this.Property = 1;  
       this.Method = function()  
       {  
              alert(1);  
       }  
}  

function AClass2()  
{  
       this.Property2 = 2;  
       this.Method2 = function()  
       {  
              alert(2);  
       }  
}  
AClass2.prototype = new AClass();  
AClass2.prototype.Property = 3;  
AClass2.prototype.Method = function()  
{  
       alert(4);  
}  
var obj = new AClass2();  
alert(obj.Property);  
obj.Method();  
</script>  

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品自在线视频| 国产精品网红福利| 日韩av电影免费观看高清| 亚洲视频欧美视频| 久久国产精品电影| 亚洲成人a级网| 亚洲一区二区免费在线| 亚洲伊人第一页| 亚洲欧美激情在线视频| 欧美亚洲一级片| 欧美激情精品久久久久久久变态| 日韩av一区在线| 蜜臀久久99精品久久久无需会员| 国产精品久久久久久五月尺| 欧美国产高跟鞋裸体秀xxxhd| 精品久久久91| 亚洲最大福利视频| 91久久久国产精品| xxxx性欧美| 亚洲成人亚洲激情| 91夜夜未满十八勿入爽爽影院| 久热精品视频在线| 成人羞羞国产免费| 亚洲国产私拍精品国模在线观看| 亚洲桃花岛网站| 欧美大片在线看免费观看| 欧美人交a欧美精品| 午夜精品99久久免费| 日韩在线观看免费全集电视剧网站| 欧美中文在线观看| 欧美视频专区一二在线观看| 日韩不卡在线观看| 精品国内亚洲在观看18黄| 日本一区二区不卡| 亚洲第一av在线| 国产欧美精品一区二区| 久久中文字幕视频| 国产精品免费视频xxxx| 亚洲小视频在线观看| 茄子视频成人在线| 91tv亚洲精品香蕉国产一区7ujn| 日韩在线观看免费| 亚洲免费av片| 国产中文字幕日韩| 色综合视频一区中文字幕| 91精品久久久久久久久久| 中文字幕日韩视频| 97婷婷大伊香蕉精品视频| 久久久久久久久久婷婷| 一区二区三区 在线观看视| 亚洲深夜福利在线| 国产在线精品自拍| 91久久久久久久一区二区| 国产日韩欧美在线看| 69视频在线播放| 97在线观看视频国产| 欧美黄色片视频| 一区二区三区回区在观看免费视频| 久久久久久久一区二区三区| 最新国产成人av网站网址麻豆| 国内精品国产三级国产在线专| 日韩免费在线视频| 日韩欧美国产成人| 日韩精品在线播放| 日本国产精品视频| 一本一本久久a久久精品综合小说| 亚洲欧美国内爽妇网| 日本精品视频在线观看| 2018国产精品视频| 国产精品 欧美在线| 久久久精品一区| 欧美激情视频一区| 一区二区三区久久精品| 欧美日韩性生活视频| 精品国模在线视频| 国产精品第七影院| 久久久精品欧美| 亚洲欧美国产精品久久久久久久| 日韩av在线一区二区| 欧美午夜电影在线| 亚洲免费电影在线观看| 欧美激情欧美激情在线五月| 国产精品88a∨| 成人欧美一区二区三区在线| 亚洲最大av网站| 精品久久久久久中文字幕大豆网| 全色精品综合影院| 亚洲午夜av久久乱码| 日韩电视剧免费观看网站| 亚洲片在线观看| 日韩在线观看视频免费| 成人亚洲综合色就1024| 亚洲美女免费精品视频在线观看| 国产成人高清激情视频在线观看| 欧美性理论片在线观看片免费| 久久久久久久久久久人体| 国产99久久精品一区二区 夜夜躁日日躁| 国产欧美va欧美va香蕉在线| 狠狠躁夜夜躁久久躁别揉| 亚洲国产高清高潮精品美女| 日韩av影视综合网| 精品国产欧美一区二区三区成人| 91精品久久久久久久久久| 亚洲免费电影一区| 国产精品久久9| 欧美激情一级欧美精品| 最新国产精品拍自在线播放| 91精品国产91久久久久久不卡| 国产婷婷成人久久av免费高清| 亚洲自拍偷拍第一页| 日韩电影中文字幕av| 国产精品免费久久久久久| 欧美国产日韩一区二区三区| 日韩欧美在线第一页| 亚洲色图色老头| 国产成人综合亚洲| 欧美极品少妇与黑人| 亚洲欧美制服综合另类| 97超碰国产精品女人人人爽| 亚洲天堂免费观看| 日韩在线精品一区| 国产成+人+综合+亚洲欧洲| 亚洲美女精品成人在线视频| 亚洲国产精品电影| 国产午夜精品视频免费不卡69堂| 欧美大片在线看| 国产精品香蕉在线观看| 欧美激情a∨在线视频播放| 中文字幕免费精品一区高清| 国产精品xxxxx| 国产极品jizzhd欧美| 欧美在线视频一区| 国产在线精品播放| 亚洲香蕉伊综合在人在线视看| 亚洲一区二区免费在线| 色视频www在线播放国产成人| 日韩国产中文字幕| 国产精品日韩电影| 岛国视频午夜一区免费在线观看| 欧美性色19p| 欧美大片第1页| 国产视频在线一区二区| 日韩亚洲欧美中文高清在线| 欧美日韩国产一区二区三区| 亚洲片在线观看| 国产一区二区三区视频| 精品国产91久久久久久老师| 国产一区二区丝袜| 亚洲成avwww人| 久久久精品在线观看| 日韩av手机在线| 国产精品自产拍在线观看中文| 中日韩美女免费视频网址在线观看| 亚洲成人av片在线观看| 中文字幕视频在线免费欧美日韩综合在线看| 欧美电影免费观看电视剧大全| 成人看片人aa| 亚洲国产成人爱av在线播放| 欧美激情日韩图片| 国产v综合v亚洲欧美久久| 精品性高朝久久久久久久| 亚洲xxx自由成熟| 最新国产精品拍自在线播放| 亚洲精品久久久久久久久|