javascript之一切皆為對象2


其實呢,“函數function”和“對象object”之間還有這么一句話:對象是通過函數來創建的,而函數卻又是一種對象

這個函數是一種對象,上節中“Javascript之一切皆為對象1”也清楚的闡述了。

但這個對象又是通過函數來創建的,咳咳,似乎在平時代碼中也是哈。

請看下面代碼

function Fn(){

}
var fn =new Fn(); 

你可能會說,哥們,不對吧,不是我們也曾寫過如下代碼嗎!!

var obj = {};

哈,是的哈。

但是,還記得么?

以上代碼,其本質是這樣的:

var obj = new Object();

咦,好吧,我承認是這樣的,但是它為什么會這么設置呢?

prototype。

prototype?

對,還記得大明湖畔的原型鏈么。。。

每個函數都有一個prototype屬性,且prototype是一個對象。

當我們通過函數function,(new)創建一個對象時,創建的對象的隱指針__proto__,就指向這個函數的prototype對象。

?!!在說什么。見下圖:

 

上圖中,中間是函數Fn,函數Fn有一個prototype對象,prototype對象中,又必須有,且自帶一個constructor屬性,它又是指向函數Fn本身的,“其他屬性”的意思是你自己可以通過prototype對象擴展屬性,當函數Fn構建好后,你可以通過new這個函數Fn,創建對象,如上圖中左邊的fn、fn1,創建的對象,自帶一個隱指針__proto__,它是指向函數Fn中的prototype,所以創建的所有對象的__proto__,是同時指向創建它的函數Fn的prototype對象啦。

有點沒看懂?

么關系,我們一起來寫個demo,一步步理解。

首先,我們一起編寫一個函數Fn,並給這個函數Fn的prototype分配兩個屬性name和age,具體代碼如下:

<!DOCTYPE html>
    <head>
        <title>ttt</title>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    </head>
    <body>
        <script>
            function Fn(){ }
            Fn.prototype.name = 'monkey';
            Fn.prototype.age = 24;
            console.log(Fn.prototype);
        </script>
    </body>
</html>

通過chrome調試器,可得下結果圖

大家可以看見我利用console.log(Fn.prototype),是輸出了age和name,但還有constructor和__proto__,我代碼中是沒有寫的,所以是prototype自帶的。

constructor倒好理解了,但它怎么會有個__proto__呢?

你上面不是說每個對象才有__proto__嗎?

是的,這個prototype也是對象哦,不要忘啦。

prototype的__proto__從上圖可知,是指向Object,修改上面的流程圖,可得下圖

接下來,我們再通過函數Fn,來創建兩個對象fn和fn1,代碼如下

<!DOCTYPE html>
    <head>
        <title>ttt</title>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    </head>
    <body>
        <script>
            function Fn(){ }
            Fn.prototype.name = 'monkey';
            Fn.prototype.age = 24;
            var fn = new Fn();
            var fn1 = new Fn();
            console.log( fn.prototype );
            console.log( fn1.prototype );
        </script>
    </body>
</html>

通過chrome調試器,效果圖如下

 

咦,怎么是undefined呢?!!

哈哈哈,仔細看我上面的代碼,我console的是對象fn和fn1的prototype哦!只有函數才有prototype,對象只有隱指針__proto__哦,它是指向函數Fn的prototype的哈。

修改代碼,通過chrome調試器的效果圖如下:

 

它們的__proto__都是指向創建它們的Fn的prototype的哈,且是同一個。這也就好理解了,為什么它們是共享Fn的prototype了哈。

Javascript之一切皆為對象3

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM