上文(理解javascript原型和作用域系列(1)——一切都是物件)已經提到,函式就是物件的一種,因為通過instanceof函式可以判斷。
var fn = function () { }; console.log(fn instanceof Object); // true
對!函式是一種物件,但是函式卻不像陣列一樣——你可以說陣列是物件的一種,因為陣列就像是物件的一個子集一樣。但是函式與物件之間,卻不僅僅是一種包含和被包含的關係,函式和物件之間的關係比較複雜,甚至有一點雞生蛋蛋生雞的邏輯,我們們這一節就縷一縷。
還是先看一個小例子吧。
function Fn() { this.name = '王福朋'; this.year = 1988; } var fn1 = new Fn();
上面的這個例子很簡單,它能說明:物件可以通過函式來建立。對!也只能說明這一點。
但是我要說——物件都是通過函式建立的——有些人可能反駁:不對!因為:
var obj = { a: 10, b: 20 }; var arr = [5, 'x', true];
但是不好意思,這個——真的——是一種——“快捷方式”,在程式語言中,一般叫做“語法糖”。
做“語法糖”做的最好的可謂是微軟大哥,它把他們家C#那小子弄的不男不女從的,本想圖個人見人愛,誰承想還得到處跟人解釋——其實它是個男孩!
話歸正傳——其實以上程式碼的本質是:
//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原始碼解讀》