JS函數淺析之constructor、prototype屬性

來源:互聯網
上載者:User

函數是JS裡很神奇的一位童鞋。那麼如何建立一個函數呢?簡單來說有下面幾種形式:
    1、定義式
    function a() {}
    2、聲明式
    var a = function() {}; // 把一個匿名函數賦給一個變數
    3、建構函式
    var a = new Function(); // 用Function來執行個體化一個對象

    函數有什麼用呢?封裝,重用,對吧,把一些動作封裝起來,讓其他童鞋可以重複調用【使用()操作符即可】。
    函數按照功能分,可以分為:
    1、普通函數;
        普通函數就是一般方法的封裝跟重用,如上面的a;
    2、建構函式;
        建構函式用來執行個體化一個對象,像是一道菜譜,按照這個菜譜炒了一盤菜;定義建構函式,有個不成文的規定,就是函數名大寫,如:var A = function() {};
    3、對象方法;
        用來定義一個對象的方法,比如一個Person對象var Person = {};需要定義一個getName方法,如:Person.getName = function() {};

    函數之constructor
    每個函數都有一個constructor屬性,這個屬性指向建立自己的函數;如上文中的a函數,他的constructor指向誰呢?誰建立它指向誰唄?那是誰建立的呢?在firebug等控制台上輸入a.constructor,顯示Function()。為什麼是Function呢?其實,無論用上面的哪種形式建立函數,在後台都會使用new Function()形式建立。那Function的constructor指向誰呢?很意外,還是Function?為什嗎?由於Function是ECMAScript規定的本機物件,獨立於宿主環境,這說明只要開啟宿主環境(如:瀏覽器)這個Function就可以用了。

    函數之prototype
    跟constructor一樣,prototype也是每個函數預設就具有的屬性,這個屬性指向prototype對象,而prototype裡面居然也有一個constructor屬性,指向了這個函數。

    建構函式
    建構函式可以執行個體化一個對象:如:var Person = function() {}; var p = new Person(); 這個p就是通過Person建立的,那麼它的constrctor指向了Person,而其內部還有個__proto__屬性,在firefox、chrome等瀏覽器下可以直接存取這個屬性,這個屬性指向了prototype對象。

    執行個體、原型、建構函式 之間的關係
    執行個體是通過建構函式建立,但是跟建構函式沒有直接關係,其內部的__proto__屬性指向了prototype,而prototype(原型)的constructor指向了建構函式,建構函式的prototype屬性指向了原型(prototype),所以說執行個體跟建構函式都是通過prototype發生了關係。。。。

作者“馮尚實的部落格”

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.