函數是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發生瞭關系。。。。
作者“馮尚實的博客”