欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JavaScript prototype對象的屬性說明

 更新時間:2010年03月13日 11:58:13   作者:  
JavaScript中對象的prototype屬性,是用來返回對象類型原型的引用的。我們使用prototype屬性提供對象的類的一組基本功能。并且對象的新實例會”繼承”賦予該對象原型的操作。但是這個prototype到底是怎么實現(xiàn)和被管理的呢?

一、什么是JavaScript中對象的prototype屬性
  JavaScript中對象的prototype屬性,是用來返回對象類型原型的引用的。我們使用prototype屬性提供對象的類的一組基本功能。并且對象的新實例會”繼承”賦予該對象原型的操作。但是這個prototype到底是怎么實現(xiàn)和被管理的呢?
對于對象的prototype屬性的說明,JavaScript手冊上如是說:所有 JavaScript內(nèi)部對象都有只讀的 prototype 屬性??梢韵蚱湓椭袆討B(tài)添加功能(屬性和方法),但該對象不能被賦予不同的原型。然而,用戶定義的對象可以被賦給新的原型。

  在JavaScript中,prototype對象是實現(xiàn)面向?qū)ο蟮囊粋€重要機制。每個函數(shù)就是一個對象(Function),函數(shù)對象都有一個子對象prototype對象,類是以函數(shù)的形式來定義的。prototype表示該函數(shù)的原型,也表示一個類的成員的集合。在通過new創(chuàng)建一個類的實例對象的時候,prototype對象的成員都成為實例化對象的成員。
  1、該對象被類所引用,只有函數(shù)對象才可引用;
  2、在new實例化后,其成員被實例化,實例對象方可調(diào)用。
  同時,函數(shù)是一個對象,函數(shù)對象若直接聲明成員,不用被實例化即可調(diào)用。
JavaScript通過一種鏈接機制來支持繼承,而不是通過完全面向?qū)ο笳Z言(如Java)所支持的基于類的繼承模型。每個JavaScript對象都有一個內(nèi)置的屬性,名為prototype。prototype屬性保存著對另一個JavaScript對象的引用,這個對象作為當(dāng)前對象的父對象。 
 

 當(dāng)通過點記法引用對象的一個函數(shù)或?qū)傩詴r,倘若對象上沒有這個函數(shù)或?qū)傩裕藭r就會使用對象的prototype屬性。當(dāng)出現(xiàn)這種情況時,將檢查對象prototype屬性所引用的對象,查看是否有所請求的屬性或函數(shù)。如果prototype屬性引用的對象也沒有所需的函數(shù)或?qū)傩裕瑒t會進一步檢查這個對象(prototype屬性引用的對象)的prototype屬性,依次沿著鏈向上查找,直到找到所請求的函數(shù)或?qū)傩?,或者到達鏈尾,如果已經(jīng)到達鏈尾還沒有找到,則返回undefined。從這個意義上講,這種繼承結(jié)構(gòu)更應(yīng)是一種“has a”關(guān)系,而不是“is a”關(guān)系
神啊,我什么也看懂,怎么辦?看似搞得我很牛,說實話我也看不懂!^_^ ^_^ ^_^
二、prototype屬性應(yīng)用實例
 我們所常見的類包括:數(shù)組變量(Array)、邏輯變量(Boolean)、日期變量(Date)、結(jié)構(gòu)變量(Function)、數(shù)值變量(Number)、對象變量(Object)、字符串變量(String) 等,而相關(guān)的類的方法,也是程序員經(jīng)常用到的(在這里要區(qū)分一下類的注意和屬性發(fā)方法),例如數(shù)組的push方法、日期的get系列方法、字符串的split方法等等,
  但是在實際的編程過程中不知道有沒有感覺到現(xiàn)有方法的不足?prototype 方法應(yīng)運而生!下面,將通過實例由淺入深講解 prototype 的具體使用方法:
 先看一個很傻的例子:

JavaScript代碼
function func(){   
    func.prototype.name = “prototype of func”;   
}   
var f = new func();          
alert(f.name);  //prototype of func
 先創(chuàng)建一個func對象,設(shè)置func對象的name屬性,實例化f;

1.幾個簡單的例子:
(1)數(shù)字相加:
JavaScript代碼
Number.prototype.add=function(num){   
    return (this+num);//這里的this指向Number   
};   
alert((3).add(15));//18  
(2) Boolean.rev(): 作用,布爾變量取反
實現(xiàn)方法:Boolean.prototype.rev = function(){return(!this);}
試驗:alert((true).rev()) -> 顯示 false
2、已有方法的實現(xiàn)和增強,初識 prototype:
(1) Array.push(new_element)
  作用:在數(shù)組末尾加入一個新的元素
  實現(xiàn)方法:
  Array.prototype.push = function(new_element){
        this[this.length]=new_element;
        return this.length;
    }
  讓我們進一步來增強他,讓他可以一次增加多個元素!
  實現(xiàn)方法:
  Array.prototype.pushPro = function() {
        var currentLength = this.length;
        for (var i = 0; i < arguments.length; i++) {
            this[currentLength + i] = arguments[i];
        }
        return this.length;
    }
  應(yīng)該不難看懂吧?以此類推,你可以考慮一下如何通過增強 Array.pop 來實現(xiàn)刪除任意位置,任意多個元素(具體代碼就不再細(xì)說了)

3、新功能的實現(xiàn),深入 prototype:在實際編程中所用到的肯定不只是已有方法的增強,更多的實行的功能的要求,下面我就舉兩個用 prototype 解決實際問題的例子:
(1) String.left()
  問題:用過 vb 的應(yīng)該都知道left函數(shù),從字符串左邊取 n 個字符,但是不足是將全角、半角均視為是一個字符,造成在中英文混排的版面中不能截取等長的字符串
  作用:從字符串左邊截取 n 個字符,并支持全角半角字符的區(qū)分
  實現(xià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()
  作用:計算出兩個日期型變量的間隔時間(年、月、日、周)
  實現(xiàn)方法:
  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
  當(dāng)然,也可以進一步擴充,得出響應(yīng)的小時、分鐘,甚至是秒。
(3) Number.fact()
  作用:某一數(shù)字的階乘
  實現(xiàn)方法:
  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 方法中也是可行的!
 實例:
取數(shù)組的最大值:
JavaScript代碼
var oArr=new Array();   
oArr=[100,190,199,189,3000,400,4001];   
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;   
}   
alert(oArr.MAX());  
 實例為用戶自定義類添加方法:
JavaScript代碼
function TestObject()   
 {   
     this.m_Name = “ffffffffff”;   
 }   

 TestObject.prototype.ShowName = function()   
 {   
     alert(this.m_Name);   
 };   
var f=new TestObject();   
f.ShowName();  
更新自定義類的prototype:

JavaScript代碼
function TestObjectA()   
{   
   this.MethodA = function()   
   {   
      alert(‘TestObjectA.MethodA()');   
   }   
}   

function TestObjectB()   
{   
   this.MethodB = function()   
   {   
      alert(‘TestObjectB.MethodB()');   
   }   
}   

TestObjectB.prototype = new TestObjectA();  
聽說這是錯說中的繼承;哦以后慢慢學(xué)。
再看一個例子,估計你我都已經(jīng)瘋掉了:

JavaScript代碼
function RP()   
{   
    RP.PropertyA = 1;   
    RP.MethodA = function()   
    {   
         alert(“RP.MethodA ”);   
    };   

    this.PropertyA = 100;    
    this.MethodA = function()   
    {   
         alert(“this.MethodA”);   
    };   
}   

RP.prototype.PropertyA = 10;    
RP.prototype.MethodA = function()   
{   
    alert(“RP.prototype.MethodA”);   
};   
//以下執(zhí)行   
rp = new RP();   
alert(RP.PropertyA);//警告結(jié)果為:1   
RP.MethodA();//警告結(jié)果為:RP.MethodA   
alert(rp.PropertyA);//警告結(jié)果為:100   
rp.MethodA();//警告結(jié)果為:this.MethodA   
delete RP.PropertyA;   
alert(RP.PropertyA);//警告結(jié)果為:undefined   

delete rp.PropertyA;   
alert(rp.PropertyA);//警告結(jié)果為:100   
delete rp.MethodA;   
rp.MethodA();//警告結(jié)果為:RP.prototype.MethodA  
 再看一個帶有參數(shù)的,計算圓的面積:

JavaScript代碼
        <script type=“text/javascript”>   
function Circle(x,y,r){       
  this.x = x;       
  this.y = y;       
  this.r = r;       
  //this.prototype = null ;     /*這句代碼可以看作是隱含存在的,因為javascript 中“類”的定義和函數(shù)的定義結(jié)構(gòu)上沒有差異,所以可以說,所有函數(shù)都隱藏有這樣一個屬性。*/       
}   
Circle.prototype.area=function(){   
    return this.r*this.r*3.1415926;   
}   
var Circ=new Circle(0,0,5);   
alert(parseInt(Circ.area()));   
        </script>  

相關(guān)文章

最新評論