關於構造函數的測試和小結

       function Circle( radius ){ javascript

         this.r = radius; java

         this.des = "圓形";函數

         this.showInfo = function(){測試

             alert("這是一個"+this.des);this

            }prototype

       }對象

        function Circle_area(r){ return Circle.PI*this.r*this.r; }繼承

        function Circle_perimeter(r){ return  2*Circle.PI*r;}ip

        Circle.PI = 3.14;原型鏈

        Circle.perimeter = Circle_perimeter;

        Circle.prototype.area = Circle_area;     

        var c = new Circle(3);      

        //測試類屬性

        //alert(Circle.PI )//3.14

        //alert(c.PI)//undefined 由於類屬性是和類自己,也就是函數自己相關聯的,和類實例沒有直接關係。

        //alert(c.constructor.PI)//3.14 若是想經過類實例訪問類屬性,那麼就須要先訪問該實例的構造函數,進而訪問該類屬性

        //alert(Circle.des)//undefined 由於函數Circle函數中的this.des中的this指代的不是函數自己,而是調用r的對象,並且只能是對象。

        //alert(c.des)//圓形 this此時爲實例化的 對象c。

        /*結論:

            面向對象的角度:類屬性是類對象的直接屬性,且該屬性與基於該類對象生成的實例對象沒有直接關係,沒法直接調用。能夠直接經過 類名.屬性名 調用該類屬性。若是想經過該類對象的實例對象調用類屬性,那麼可使用 對象實例.constructor屬性調用該對象的類對象,而後經過類對象調用其類屬性javascript函數角度:類屬性是javascript函數對象的直接屬性變量(這裏之因此稱之爲屬性變量是因爲javascript變量和屬性的同一性),且該屬性變量與基於該函數對象構造出來的對象引用(生成了一個對象,這個對象其實是一個空對象,而且保存了對構造函數以及構造函數初始化時函數內部this關鍵字下的相關屬性和函數的引用[c.prototype和構造函數中this.下面的相關屬性、函數]:)沒有直接關係,若是想經過基於構造函數生成的對象c調用構造函數對象的屬性變量PI,那麼須要經過c.constructor屬性找到該構造函數對象,並經過該對象獲取其屬性變量。

        */

        //測試類方法

        //alert(Circle.perimeter(3)); //18.4 直接調用函數的類方法。

        //alert( c.perimeter(3) ); //FF:c.perimeter is not a function IE:對象或屬性不支持此方法。由於perimeter函數是Circle類的類方法,和實例對象沒有直接關係

        //alert(c.constructor.perimeter(3));//18.84 調用該對象構造函數(類函數)的方法(函數)。

        //alert(c.area(3))//28.25.... Circle類的prototype原型屬性下的area方法將會被Circle類的實例對象繼承。

        //alert(Circle.area(3));//FF: 錯誤: Circle.area is not a function  由於area方法是Circle類的原型屬性的方法,並非Circle類的直接方法。

     

        //結論:同上,把屬性換成了方法,把屬性變量換成了函數。

        //測試prototype對象屬性

        //alert(c.prototype); //undefined 實例對象沒有ptototype屬性

        //alert(Circle.prototype); //object Object 

        //alert(Circle.prototype.constructor)//返回Circle的函數體(函數代碼體),至關於alert(Circle)

        //alert(Circle.prototype.area(3));//NaN 方法調用成功,可是返回結果倒是NaN,緣由是area函數內部的this.r是undefined。

        //alert(Circle.prototype.PI) //undefined由於PI屬性是Circle類函數的直接屬性,並不會在prototype屬性下存在

        //alert(Circle.prototype.constructor.PI)//3.14 經過Circle類的原型對象調用該原型對象的構造函數(類函數),再經過類函數調用PI屬性。

        /*結論:prototype原型對象是javascript基於原型鏈表實現的一個重要屬性。

            Javascript角度:1. 實例對象沒有prototype屬性,只有構造函數纔有prototype屬性,也就是說構造函數自己保存了對prototype屬性的引用。。2. prototype屬性對象有一個constructor屬性,保存了引用他本身的構造函數的引用(看起來像是個循環:A指向B,B指向A...)3.prototype對象(不要被我這裏的屬性對象,對象,對象屬性搞暈乎了,說是屬性對象,就是說當前這個東西他首先是某個對象的屬性,同時本身也是個對象。對象屬性就是說它是某個對象的屬性。)的屬性變量和屬性對象將會被該prototype對象引用的構造函數所建立的對象繼承(function A(){} A.prototype.pa = function(){} var oA = new A(); 那麼oA將會繼承屬性函數pa)。

        */

        /*這裏對 對象屬性,對象方法再也不作詳細測試。

           1.javascript對象實例的在經過其構造函數進行實例化的過程當中,保存了對構造函數中全部this關鍵字引用的屬性和方法的引用(這裏不討論對象直接量語法的狀況)。但若是構造函數中沒有經過this指定,對象實例將沒法調用該方法。       2.javascript能夠經過構造函數建立多個實例,實例會經過__proto__屬性繼承原型對象的屬性和方法。若是對實例對象的屬性和方法進行讀寫操做,不會影響其原型對象的屬性和方法,也就是說,對於原型對象,javascript實例對象只能讀,不能寫。那當咱們對實例對象的屬性和方法進行修改的時候也能夠改變其值這是爲何呢?其實當咱們試圖在實例對象中使用繼承自原型對象的屬性或方法的時候,javascript會在咱們的實例對象中複製一個屬性或方法的副本,這樣,咱們操做的時候,其實操做的就是實例對象本身的屬性或方法了。

        */

        //測試__proto__屬性

        //alert(c.__proto__)//FF:object IE8:undefined 該屬性指向Circle.prototype,也就是說調用該對象將會返回Circle的prototype屬性。

        //因爲IE8及如下版本不支持__proto__屬性,因此如下結果都在FF下得出。

        //alert(c.__proto__.PI)//undefined 由於函數原型下面沒有PI屬性,PI是類函數Circle的直接屬性

        //alert(c.__proto__.area(3))//NaN 該函數執行成功,返回值爲NaN是因爲函數體中的this.r爲undefined。

        /*結論:__proto__屬性保存了對建立該對象的構造函數引用prototype屬性的引用,也就是說構造函數能夠引用prototype,基於該構 造函數生成的實例也能夠引用,只不過引用的方式不同。*/

相關文章
相關標籤/搜索