JS函數淺析之constructor、prototype屬性

    函數是JS裏很神奇的一位童鞋。那麼如何建立一個函數呢?簡單來講有下面幾種形式:
    一、定義式
    function a() {}
    二、聲明式
    var a = function() {}; // 把一個匿名函數賦給一個變量
    三、構造函數
    var a = new Function(); // 用Function來實例化一個對象chrome

    函數有什麼用呢?封裝,重用,對吧,把一些動做封裝起來,讓其餘童鞋能夠重複調用【使用()操做符便可】。
    函數按照功能分,能夠分爲:
    一、普通函數;
        普通函數就是通常方法的封裝跟重用,如上面的a;
    二、構造函數;
        構造函數用來實例化一個對象,像是一道菜譜,按照這個菜譜炒了一盤菜;定義構造函數,有個不成文的規定,就是函數名大寫,如:var A = function() {};
    三、對象方法;
        用來定義一個對象的方法,好比一個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屬性,指向了這個函數。firefox

    構造函數
    構造函數能夠實例化一個對象:如:var Person = function() {}; var p = new Person(); 這個p就是經過Person建立的,那麼它的constrctor指向了Person,而其內部還有個__proto__屬性,在firefox、chrome等瀏覽器下能夠直接訪問這個屬性,這個屬性指向了prototype對象。prototype

    實例、原型、構造函數 之間的關係
    實例是經過構造函數建立,可是跟構造函數沒有直接關係,其內部的__proto__屬性指向了prototype,而prototype(原型)的constructor指向了構造函數,構造函數的prototype屬性指向了原型(prototype),因此說實例跟構造函數都是經過prototype發生了關係。。。。對象

相關文章
相關標籤/搜索