深刻理解javascript原型和閉包(2)——函數和對象的關係

上文(理解javascript原型和做用域系列(1)——一切都是對象)已經提到,函數就是對象的一種,由於經過instanceof函數能夠判斷。javascript

var fn = function () { };
console.log(fn instanceof Object);  // true

對!函數是一種對象,可是函數卻不像數組同樣——你能夠說數組是對象的一種,由於數組就像是對象的一個子集同樣。可是函數與對象之間,卻不單單是一種包含和被包含的關係,函數和對象之間的關係比較複雜,甚至有一點雞生蛋蛋生雞的邏輯,我們這一節就縷一縷。html

 

仍是先看一個小例子吧。前端

        function Fn() {
            this.name = '王福朋';
            this.year = 1988;
        }
        var fn1 = new Fn();

上面的這個例子很簡單,它能說明:對象能夠經過函數來建立。對!也只能說明這一點。java

可是我要說——對象都是經過函數建立的——有些人可能反駁:不對!由於:web

var obj = { a: 10, b: 20 };
var arr = [5, 'x', true];

可是很差意思,這個——真的——是一種——「快捷方式」,在編程語言中,通常叫作「語法糖」。面試

作「語法糖」作的最好的可謂是微軟大哥,它把他們家C#那小子弄的不男不女從的,本想圖我的見人愛,誰承想還獲得處跟人解釋——其實它是個男孩!編程

話歸正傳——其實以上代碼的本質是:json

        //var obj = { a: 10, b: 20 };
        //var arr = [5, 'x', true];

        var obj = new Object();
        obj.a = 10;
        obj.b = 20;

        var arr = new Array();
        arr[0] = 5;
        arr[1] = 'x';
        arr[2] = true;

而其中的 Object 和 Array 都是函數:數組

console.log(typeof (Object));  // function
console.log(typeof (Array));  // function

因此,能夠很負責任的說——對象都是經過函數來建立的閉包

 

如今是否是糊塗了—— 對象是函數建立的,而函數卻又是一種對象——天哪!函數和對象究竟是什麼關係啊?

彆着急!揭開這個謎底,還得先去了解一下另外一位老朋友——prototype原型。

 

本系列文章不打算動輒幾千字的長篇大論,我們小步快跑,不至於看的太乏味。

 

---------------------------------------------------------------------------

本文已更新到《深刻理解javascript原型和閉包》的目錄,更多內容可參見《深刻理解javascript原型和閉包》。

另外,歡迎關注個人微博

學習做者教程:《前端JS高級面試》《前端JS基礎面試題》《React.js模擬大衆點評webapp》《zepto設計與源碼分析》《json2.js源碼解讀

相關文章
相關標籤/搜索